Skip to content

Instantly share code, notes, and snippets.

@mtmk
Last active July 27, 2018 05:40
Show Gist options
  • Select an option

  • Save mtmk/387e2ee163e07390f92e to your computer and use it in GitHub Desktop.

Select an option

Save mtmk/387e2ee163e07390f92e to your computer and use it in GitHub Desktop.
Boilerplate Windows Service in C#
// 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);
}
}
}
<?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>
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