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>
internal sealed class ServiceEventLogAppender : AppenderSkeleton
{
private readonly IServiceEventLogProvider provider;
private readonly WrapperServiceEventLogProvider provider;
internal ServiceEventLogAppender(IServiceEventLogProvider provider)
internal ServiceEventLogAppender(WrapperServiceEventLogProvider provider)
{
this.provider = provider;
}
@ -21,8 +21,20 @@ namespace WinSW.Logging
{
var eventLog = this.provider.Locate();
// We write the event iff the provider is ready
eventLog?.WriteEntry(loggingEvent.RenderedMessage, ToEventLogEntryType(loggingEvent.Level));
if (eventLog is not null)
{
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)

View File

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

View File

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