作为服务运行时,Serilog 文件日志记录未从 Worker Service 写入

dav*_*d w 5 c# windows-services serilog asp.net-core-6.0

我正在编写一个工作服务,需要使用 Serilog 并写入日志文件。(.net core 6 和 Windows 服务)。当使用 Microsoft.Extensions.Logging 并按照 aspsettings.json 中配置写入事件日志时,相同的服务可以很好地记录到事件日志中。另外,我已经证明我有权访问写入日志的目录。

当我将项目配置为使用 Serilog 写入日志文件时,日志文件永远不会被写入(如果它不存在,则不会创建它)。我希望您能提供有关未创建日志文件的原因的任何意见。

Nuget 包

<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="5.0.0" />
<PackageReference Include="Serilog.Enrichers.Environment" Version="2.2.0" />
Run Code Online (Sandbox Code Playgroud)

程序.cs

<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="5.0.0" />
<PackageReference Include="Serilog.Enrichers.Environment" Version="2.2.0" />
Run Code Online (Sandbox Code Playgroud)

我的应用程序设置配置为写入控制台和文件,其中文件使用 Json 格式化程序。正在加载应用程序设置。在添加 Serilog 之前,我正在加载配置事件日志记录的应用程序设置,结果成功。SetBasePath 是实现这一目标的关键。

appsettings.json 中的片段

using Serilog;
using WorkerServiceAndSerilog;

IHost host = Host.CreateDefaultBuilder(args)
    .UseWindowsService()
    .ConfigureAppConfiguration((builderContext, config) =>
    {
        config.SetBasePath(System.AppDomain.CurrentDomain.BaseDirectory);
    })
    .ConfigureServices(services =>
    {
        services.AddHostedService<Worker>();
        services.AddLogging(configure => configure.AddSerilog());
    })
    .UseSerilog((hostingContext, loggerConfiguration) =>
                loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration))
    .Build();

var logger = host.Services.GetService<ILogger<Program>>();

logger!.LogInformation($"Before host.RunAsync");

using (System.IO.StreamWriter file = new System.IO.StreamWriter(path: @"c:\POC\logs\accessProof.txt", true))
    file.WriteLine($"We're Running WorkerServiceAndSerilog {DateTime.Now}");

await host.RunAsync();
Run Code Online (Sandbox Code Playgroud)

dav*_*d w 5

mason给出的自日志建议指出了Serilog无法加载的内容。我能够使用该信息来找到解决方案。

在 .Net Core 5 和 6 中,有一个发布选项可以生成单个文件。我正在使用该选项。如此发布时,Serilog 不支持自动发现配置程序集(文档)。因此无法加载水槽、浓缩器等。

我的解决方案是在 appsettings.json 中添加一条 using 语句。

  "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Enrichers.Environment", "Serilog.Enrichers.Thread", "Serilog.Exceptions", "Serilog.Expressions" ],
    "Enable": true,
    "MinimumLevel": {
...

Run Code Online (Sandbox Code Playgroud)