ASP.NET 核心 2.2 - Serilog |错过活动

ASP.NET Core 2.2 - Serilog | Missing out on events

ASP.NET Core 的新手,并尝试从另一个 [Core] 库中重用我已经配置的 Serilog。这是我的设置 -

Test.sln
  Test.Core (project)
      - Serilog init config
      - Autofac dependency injection
      - Other stuff
  Test.WebAPI (project)
      - Configured Autofac module from my Core library in ConfigureContainer method.

了解基本设置。我所做的任何 services/controllers 都从我在核心库的 Autofac 模块中完成的注册中接收依赖项(也包括日志记录,但前提是我明确调用 _logger.Information / _logger.Debug,等等. 并按照 Serilog 配置中的配置打印到控制台和日志文件。

似乎 ASP.NET 有自己的记录器,并且正在使用自己的记录器记录所有事件,例如这些事件 - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.2#sample-logging-output

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/api/todo/0
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action method TodoApi.Controllers.TodoController.GetById (TodoApi) with arguments (0) - ModelState is Valid
info: TodoApi.Controllers.TodoController[1002]
      Getting item 0
warn: TodoApi.Controllers.TodoController[4000]
      GetById(0) NOT FOUND

我正在尝试将 ASP.NET 的记录器记录的事件重新路由到我自己的记录器,并且周围只有一个记录器,但不知道如何操作。任何人都可以指出我正确的方向吗?提前致谢!

对于 "silence" ASP.NET 默认日志,您需要将此添加到您的 appsettings.json:

"Logging": {
    "LogLevel": {
      "Default": "Debug",
      "Microsoft": "Warning",
      "System": "Warning"
    }
  }

那么默认的logger只会记录"Warning"或更低级别的所有内容(日志有6个级别:Trace、Debug、Information、警告,严重错误 )。另外,为了启用 Serilog,你只需要添加这个包:

<PackageReference Include="Serilog.AspNetCore" Version="#version#" />

并将此添加到您的 Program.cs:

WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseSerilog(); //this line

然后你可以简单地用 DI 注入 ILogger<T>,它会在你的配置中使用 Serilog。另外,它会封装你的 Serilog,这样以后使用其他日志框架会更容易

更新: 为了删除以前配置的提供程序,请尝试添加此行:

new WebHostBuilder()
.ConfigureLogging(builder => builder.ClearProviders()) // <--here

在我的例子中,我必须在 Startup.cs/Configure() 方法中从核心库设置 Serilog 的 ILogger。

Program.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
          .ConfigureServices(services => services.AddAutofac())
          .UseStartup<Startup>()
          .UseSerilog(); // Added this line as per docs

Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IZLogger zLogger)
{
    ...
    Log.Logger = zLogger.GetCurrentClassLogger<Startup>(); // Set Serilog's ILogger from Core library
    app.UseSerilogRequestLogging(); // Added this line as per docs
    ...
}

示例日志:

2019-07-22 19:01:03.179 -04:00 | [INFO] | Request starting HTTP/1.1 GET https://localhost:5001/favicon.ico  
2019-07-22 19:01:03.180 -04:00 | [INFO] | HTTP GET /favicon.ico responded 404 in 0.394846 ms
2019-07-22 19:01:03.181 -04:00 | [INFO] | Request finished in 1.8292ms 404 text/plain