2

我无法从我的 IIS 托管的 .net core 2.2 应用程序中获取 Seq 中的日志语句。当我使用 IISExpres 调试和运行应用程序时,会出现这些日志。但是,当应用程序从真实 IIS 的应用程序池运行时,只有 RequestLogging 日志显示在 Seq 中。我想念我的日志。

这是我所做的:

  1. 已安装 Nuget 包 Serilog、Serilog.Aspnetcore 和 Serilog.Sinks.Seq。

  2. 删除了所有 Microsoft.Extensions.Logging 和引用。

  3. 按照 Serilog.Aspnetcore Github 页面上的示例在 Program.cs 中实施内联配置:

public class Program
{
      ...

      public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseSerilog((hostingContext, loggerConfiguration) =>
                       loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration)
                        , preserveStaticLogger: true, writeToProviders: false);


}
  1. 在 Startup.cs 中添加了请求日志记录:
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            ....

            app.UseHttpsRedirection();
            app.UseSerilogRequestLogging();
            app.UseMvc();
        }
  1. 在 appsettings.json 中配置了 Serilog,因此 apiKey 和 Seq serverUrl 可以在 Azure DevOps 部署中配置用于开发、测试和生产环境:
{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Seq" ],
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Enrich": [ "FromLogContext" ],
    "WriteTo": [
      {
        "Name": "Seq",
        "Args": {
          "apiKey": "iVPcw1...",
          "serverUrl": "http://localhost:5341"
        }
      }
    ]
  },
    ...
}
  1. 像往常一样在类中添加记录器和初始化,如下所示:
     public class SomeService : ISomeService
     {
        private readonly ILogger logger;
        ...

        public SomeService( ...injections...) {

            logger = Log.ForContext<SomeService>();
            ...
        }

        ...
        public async Task ServiceMethod(Data d) 
        {
            logger.Information("ServiceMethod called with {@d}");
        }

        ...
    }
4

1 回答 1

1

在你的论点中UseSerilog()有:

preserveStaticLogger: true

这指示UseSerilog()不要设置/修改静态Log.Logger实例,这意味着当您使用它时:

logger = Log.ForContext<SomeService>();

您将获得默认的、未配置的、无操作的记录器。

设置preserveStaticLogger: false应该解决这个问题。

于 2020-04-02T21:57:59.577 回答