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

Serilog file logging not written from Worker Service when running as service

我正在编写一个需要使用 Serilog 并写入日志文件的辅助服务。 (.net 核心 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" />

Program.cs

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

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

来自 appsettings.json

的片段
  "Serilog": {
    "Enable": true,
    "MinimumLevel": {
      "Default": "Verbose",
      "Override": {
        "System": "Error",
        "Microsoft": "Verbose",
        "Microsoft.AspNetCore": "Verbose",
        "Microsoft.EntityFrameworkCore": "Information"
      }
    },
    "WriteTo": [
      {
        "Name": "Logger",
        "Args": {
          "configureLogger": {
            "WriteTo": [
              {
                "Name": "Console",
                "Args": {
                  "restrictedToMinimumLevel": "Debug",
                  "outputTemplate": "{Timestamp:MM-dd HH:mm:ss.ffff} | {Level:u3} | {MachineName} | {RequestId} | {Assembly} | {Version} | {Message:lj}{NewLine}{Exception}"
                }
              },
              {
                "Name": "File",
                "Args": {
                  "restrictedToMinimumLevel": "Information",
                  "path": "\POC\logs\WS.log",
                  "rollingInterval": "Day",
                  "retainedFileCountLimit": 7,
                  "buffered": true,
                  "flushToDiskInterval": "00:00:02",
                  "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"
                }
              }

mason给的self log建议指出了Serilog无法加载的地方。我能够使用该信息找到解决方案。

在 .Net Core 5 和 6 中,有一个用于生成单个文件的发布选项。我正在使用该选项。如此发布时,Serilog 不支持 auto-discovery 个配置程序集 (documentation)。因此无法加载 Sinks、Enrichers 等。

我的解决方案是在 appsettings.json.

中添加一个 using 语句
  "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Enrichers.Environment", "Serilog.Enrichers.Thread", "Serilog.Exceptions", "Serilog.Expressions" ],
    "Enable": true,
    "MinimumLevel": {
...