Last active
July 27, 2018 05:40
-
-
Save mtmk/387e2ee163e07390f92e to your computer and use it in GitHub Desktop.
Boilerplate Windows Service in C#
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // reference System.ServiceProcess | |
| // nuget install log4net | |
| class Program : ServiceBase | |
| { | |
| static readonly ILog Logger = LogManager.GetLogger("main"); | |
| static void Main(string[] args) | |
| { | |
| // Configure logging | |
| log4net.Config.XmlConfigurator.Configure(new FileInfo(Path.Combine(AssemblyDirectory, "log4net.config"))); | |
| Logger.InfoFormat("Starting {0}", Assembly.GetExecutingAssembly().GetName().Version); | |
| AppDomain.CurrentDomain.UnhandledException += (_, e) => Logger.Error(string.Format("UnhandledException. Terminating:{0}", e.IsTerminating), e.ExceptionObject as Exception); | |
| // Run on console | |
| if (args.Length > 0 && args[0] == "-console") | |
| { | |
| var program = new Program(); | |
| program.OnStart(args.Skip(1).ToArray()); | |
| var r = new ManualResetEvent(false); | |
| Console.CancelKeyPress += (_, e) => { e.Cancel = true; r.Set(); }; | |
| r.WaitOne(); | |
| program.OnStop(); | |
| return; | |
| } | |
| // Run as windows service | |
| Run(new Program()); | |
| } | |
| protected override void OnStart(string[] args) | |
| { | |
| Logger.Info("Starting.."); | |
| // Setup your threads of work here | |
| } | |
| protected override void OnStop() | |
| { | |
| Logger.Info("Stopping.."); | |
| // Dispose your resources here | |
| } | |
| // http://stackoverflow.com/questions/52797/how-do-i-get-the-path-of-the-assembly-the-code-is-in/283917#283917 | |
| static string AssemblyDirectory | |
| { | |
| get | |
| { | |
| string codeBase = Assembly.GetExecutingAssembly().CodeBase; | |
| var uri = new UriBuilder(codeBase); | |
| string path = Uri.UnescapeDataString(uri.Path); | |
| return Path.GetDirectoryName(path); | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?xml version="1.0" encoding="utf-8" ?> | |
| <!-- copy to output --> | |
| <log4net> | |
| <appender name="Console" type="log4net.Appender.ColoredConsoleAppender"> | |
| <mapping> | |
| <level value="ERROR" /> | |
| <foreColor value="Red, HighIntensity" /> | |
| </mapping> | |
| <mapping> | |
| <level value="INFO" /> | |
| <foreColor value="White" /> | |
| </mapping> | |
| <mapping> | |
| <level value="WARN" /> | |
| <foreColor value="Yellow, HighIntensity" /> | |
| </mapping> | |
| <mapping> | |
| <level value="DEBUG" /> | |
| <foreColor value="Green" /> | |
| </mapping> | |
| <layout type="log4net.Layout.PatternLayout"> | |
| <conversionPattern value="%d [%t] %-5p %c - %m%n" /> | |
| </layout> | |
| </appender> | |
| <appender name="RollingFileMsg" type="log4net.Appender.RollingFileAppender"> | |
| <file value="logs\msg.log.txt" /> | |
| <appendToFile value="true" /> | |
| <rollingStyle value="Size" /> | |
| <maxSizeRollBackups value="10" /> | |
| <maximumFileSize value="10MB"/> | |
| <staticLogFileName value="true" /> | |
| <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> | |
| <layout type="log4net.Layout.PatternLayout"> | |
| <conversionPattern value="%d [%t] %-5p %c - %m%n" /> | |
| </layout> | |
| </appender> | |
| <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> | |
| <filter type="log4net.Filter.LevelRangeFilter"> | |
| <param name="LevelMin" value="DEBUG"/> | |
| <param name="LevelMax" value="FATAL"/> | |
| </filter> <file value="logs\info.log.txt" /> | |
| <appendToFile value="true" /> | |
| <rollingStyle value="Size" /> | |
| <maxSizeRollBackups value="10" /> | |
| <maximumFileSize value="10MB"/> | |
| <staticLogFileName value="true" /> | |
| <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> | |
| <layout type="log4net.Layout.PatternLayout"> | |
| <conversionPattern value="%d [%t] %-5p %c - %m%n" /> | |
| </layout> | |
| </appender> | |
| <appender name="RollingFileForErrors" type="log4net.Appender.RollingFileAppender"> | |
| <filter type="log4net.Filter.LevelRangeFilter"> | |
| <param name="LevelMin" value="ERROR"/> | |
| <param name="LevelMax" value="FATAL"/> | |
| </filter> | |
| <file value="logs\error.log.txt" /> | |
| <appendToFile value="true"/> | |
| <rollingStyle value="Size"/> | |
| <maxSizeRollBackups value="10"/> | |
| <maximumFileSize value="10MB"/> | |
| <staticLogFileName value="true"/> | |
| <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> | |
| <layout type="log4net.Layout.PatternLayout"> | |
| <conversionPattern value="%d [%t] %-5p %c - %m%n" /> | |
| </layout> | |
| </appender> | |
| <root> | |
| <level value="DEBUG" /> | |
| <appender-ref ref="Console" /> | |
| <appender-ref ref="RollingFile"/> | |
| <appender-ref ref="RollingFileForErrors"/> | |
| </root> | |
| <logger name="msg.logs"> | |
| <level value="VERBOSE" /> | |
| <appender-ref ref="RollingFileMsg" /> | |
| </logger> | |
| </log4net> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| static class LogExtentions | |
| { | |
| // http://stackoverflow.com/questions/2279773/log4net-how-to-log-a-verbose-message | |
| public static void Trace(this ILog log, string message, Exception exception) | |
| { | |
| log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, | |
| log4net.Core.Level.Trace, message, exception); | |
| } | |
| public static void Trace(this ILog log, string message) | |
| { | |
| log.Trace(message, null); | |
| } | |
| public static void Verbose(this ILog log, string message, Exception exception) | |
| { | |
| log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, | |
| log4net.Core.Level.Verbose, message, exception); | |
| } | |
| public static void Verbose(this ILog log, string message) | |
| { | |
| log.Verbose(message, null); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment