Ensure basic event logging

pull/730/head
NextTurn 2020-03-10 00:00:00 +08:00 committed by Next Turn
parent 9d0851b3b0
commit cb8ded23c7
4 changed files with 43 additions and 36 deletions

View File

@ -1,14 +0,0 @@
namespace WinSW.Logging
{
/// <summary>
/// Indicates that the class may reference the event log
/// </summary>
internal interface IServiceEventLogProvider
{
/// <summary>
/// Locates Event Log for the service.
/// </summary>
/// <returns>Event Log or null if it is not avilable</returns>
IServiceEventLog? Locate();
}
}

View File

@ -10,9 +10,9 @@ namespace WinSW.Logging
/// </summary> /// </summary>
internal sealed class ServiceEventLogAppender : AppenderSkeleton internal sealed class ServiceEventLogAppender : AppenderSkeleton
{ {
private readonly IServiceEventLogProvider provider; private readonly WrapperServiceEventLogProvider provider;
internal ServiceEventLogAppender(IServiceEventLogProvider provider) internal ServiceEventLogAppender(WrapperServiceEventLogProvider provider)
{ {
this.provider = provider; this.provider = provider;
} }
@ -21,8 +21,20 @@ namespace WinSW.Logging
{ {
var eventLog = this.provider.Locate(); var eventLog = this.provider.Locate();
// We write the event iff the provider is ready if (eventLog is not null)
eventLog?.WriteEntry(loggingEvent.RenderedMessage, ToEventLogEntryType(loggingEvent.Level)); {
eventLog.WriteEntry(loggingEvent.RenderedMessage, ToEventLogEntryType(loggingEvent.Level));
return;
}
try
{
using var backupLog = new EventLog("Application", ".", "Windows Service Wrapper");
backupLog.WriteEntry(loggingEvent.RenderedMessage, ToEventLogEntryType(loggingEvent.Level));
}
catch
{
}
} }
private static EventLogEntryType ToEventLogEntryType(Level level) private static EventLogEntryType ToEventLogEntryType(Level level)

View File

@ -3,7 +3,7 @@
/// <summary> /// <summary>
/// Implements caching of the WindowsService reference in WinSW. /// Implements caching of the WindowsService reference in WinSW.
/// </summary> /// </summary>
internal sealed class WrapperServiceEventLogProvider : IServiceEventLogProvider internal sealed class WrapperServiceEventLogProvider
{ {
public WrapperService? Service { get; set; } public WrapperService? Service { get; set; }

View File

@ -1162,7 +1162,7 @@ namespace WinSW
} }
/// <exception cref="FileNotFoundException" /> /// <exception cref="FileNotFoundException" />
private static XmlServiceConfig LoadConfigAndInitLoggers(string? path, bool enableConsoleLogging) private static XmlServiceConfig LoadConfigAndInitLoggers(string? path, bool inConsoleMode)
{ {
if (TestConfig != null) if (TestConfig != null)
{ {
@ -1177,8 +1177,11 @@ namespace WinSW
var consoleLogLevel = Level.Info; var consoleLogLevel = Level.Info;
var eventLogLevel = Level.Warn; var eventLogLevel = Level.Warn;
// console log #if NET
if (enableConsoleLogging) var repository = LogManager.GetRepository(Assembly.GetExecutingAssembly());
#endif
if (inConsoleMode)
{ {
var consoleAppender = new WinSWConsoleAppender var consoleAppender = new WinSWConsoleAppender
{ {
@ -1190,10 +1193,25 @@ namespace WinSW
BasicConfigurator.Configure( BasicConfigurator.Configure(
#if NET #if NET
LogManager.GetRepository(Assembly.GetExecutingAssembly()), repository,
#endif #endif
consoleAppender); consoleAppender);
} }
else
{
var eventLogAppender = new ServiceEventLogAppender(WrapperService.eventLogProvider)
{
Name = "Wrapper event log",
Threshold = eventLogLevel,
};
eventLogAppender.ActivateOptions();
BasicConfigurator.Configure(
#if NET
repository,
#endif
eventLogAppender);
}
XmlServiceConfig config; XmlServiceConfig config;
if (path != null) if (path != null)
@ -1213,7 +1231,7 @@ namespace WinSW
// .wrapper.log // .wrapper.log
string wrapperLogPath = Path.Combine(config.LogDirectory, config.BaseName + ".wrapper.log"); string wrapperLogPath = Path.Combine(config.LogDirectory, config.BaseName + ".wrapper.log");
var wrapperLog = new FileAppender var fileAppender = new FileAppender
{ {
AppendToFile = true, AppendToFile = true,
File = wrapperLogPath, File = wrapperLogPath,
@ -1223,22 +1241,13 @@ namespace WinSW
LockingModel = new FileAppender.MinimalLock(), LockingModel = new FileAppender.MinimalLock(),
Layout = new PatternLayout("%date %-5level - %message%newline"), Layout = new PatternLayout("%date %-5level - %message%newline"),
}; };
wrapperLog.ActivateOptions(); fileAppender.ActivateOptions();
// event log
var systemEventLogger = new ServiceEventLogAppender(WrapperService.eventLogProvider)
{
Name = "Wrapper event log",
Threshold = eventLogLevel,
};
systemEventLogger.ActivateOptions();
BasicConfigurator.Configure( BasicConfigurator.Configure(
#if NET #if NET
LogManager.GetRepository(Assembly.GetExecutingAssembly()), repository,
#endif #endif
wrapperLog, fileAppender);
systemEventLogger);
return config; return config;
} }