Обычная практика - делать то, что вы делаете, то есть инициализировать запись в самом начале и сохранять регистратор в Log.Logger
, а затем, внутри вашей службы, захватить регистратор контекста, Log.ForContext<T>
.Например,
using System.ServiceProcess;
using Serilog;
namespace WindowsServiceHost
{
public partial class MyService : ServiceBase
{
private readonly ILogger _log = Log.ForContext<MyService>();
public MyService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
_log.Information("Service starting...");
// ...
_log.Information("Service started.");
}
protected override void OnStop()
{
_log.Information("Service stopping...");
// ...
_log.Information("Service stopped.");
}
}
}
Это упрощает получение доступа к регистратору Serilog и дает дополнительное преимущество: контекстная информация о том, откуда поступают сообщения журнала, что полезно.
Возможно, вам будет интересно прочитать это: Контекст и корреляция - структурированные концепции ведения журналов в .NET (5)
Кроме того, не забудьте:позвоните Log.CloseAndFlush()
до того, как ваша служба остановится, чтобы убедиться, что любые буферизованные сообщения записаны в приемники.
static class Program
{
static void Main()
{
Log.Logger = new LoggerConfiguration()
.WriteTo.File(@"C:\SomePath\MyApp.log")
.CreateLogger();
try
{
var servicesToRun = new ServiceBase[]
{
new MyService(),
};
ServiceBase.Run(servicesToRun);
}
catch(Exception ex)
{
Log.Fatal(ex, ex.Message);
throw;
}
finally
{
Log.CloseAndFlush(); // <<<<<<<<<<<<<<<<<<<
}
}
}
Подробнее об этом можно прочитать в документации: Жизненный цикл регистраторов