Bladeren bron

Ensure basic event logging

NextTurn 5 jaren geleden
bovenliggende
commit
cb8ded23c7

+ 0 - 14
src/WinSW/Logging/IServiceEventLogProvider.cs

@@ -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();
-    }
-}

+ 16 - 4
src/WinSW/Logging/ServiceEventLogAppender.cs

@@ -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)

+ 1 - 1
src/WinSW/Logging/WrapperServiceEventLogProvider.cs

@@ -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; }
 

+ 26 - 17
src/WinSW/Program.cs

@@ -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;
         }