【问题标题】:How to prevent Serilog from logging every little step as information automatically?如何防止 Serilog 自动将每一个小步骤记录为信息?
【发布时间】:2021-08-09 20:48:34
【问题描述】:

我想将 Serilog 用于我的 .Net 5 Web Api 项目。我安装了软件包

  • Serilog.AspNetCore v4.1.0
  • Serilog.Sinks.Console v4.0.0

并将 Program.cs 文件更改为

public sealed class Program
{
    public static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .WriteTo.Console()
            .CreateLogger();
        
        CreateHostBuilder(args)
            .Build()
            .Run();
    }

    private static IHostBuilder CreateHostBuilder(string[] args) 
        => Host
            .CreateDefaultBuilder(args)
            .UseSerilog()
            .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
}

我为测试目的创建了一个控制器

[ApiController]
[Route("[controller]")]
public sealed class TodosController : ControllerBase
{
    [HttpGet("{todoId:Guid}")]
    public IActionResult GetTodoById(Guid todoId) => Ok(todoId);
}

使用此端点后,我可以在控制台中看到以下内容

[22:30:11 INF] Now listening on: https://localhost:5001
[22:30:11 INF] Now listening on: http://localhost:5000
[22:30:11 INF] Application started. Press Ctrl+C to shut down.
[22:30:11 INF] Hosting environment: Development
[22:30:11 INF] Content root path: /home/.../Server
[22:30:12 INF] Request starting HTTP/2 GET https://localhost:5001/swagger - -
[22:30:12 INF] Request finished HTTP/2 GET https://localhost:5001/swagger - - - 301 0 - 78.0119ms
[22:30:12 INF] Request starting HTTP/2 GET https://localhost:5001/swagger/index.html - -
[22:30:12 INF] Request finished HTTP/2 GET https://localhost:5001/swagger/index.html - - - 200 - text/html;charset=utf-8 64.9042ms
[22:30:12 INF] Request starting HTTP/2 GET https://localhost:5001/swagger/swagger-ui.css - -
[22:30:12 INF] Request starting HTTP/2 GET https://localhost:5001/swagger/swagger-ui-bundle.js - -
[22:30:12 INF] Request starting HTTP/2 GET https://localhost:5001/swagger/swagger-ui-standalone-preset.js - -
[22:30:12 INF] Sending file. Request path: '/swagger-ui-standalone-preset.js'. Physical path: 'N/A'
[22:30:12 INF] Sending file. Request path: '/swagger-ui.css'. Physical path: 'N/A'
[22:30:12 INF] Sending file. Request path: '/swagger-ui-bundle.js'. Physical path: 'N/A'
[22:30:12 INF] Request finished HTTP/2 GET https://localhost:5001/swagger/swagger-ui-bundle.js - - - 200 986342 application/javascript 191.4506ms
[22:30:12 INF] Request finished HTTP/2 GET https://localhost:5001/swagger/swagger-ui-standalone-preset.js - - - 200 311804 application/javascript 191.4478ms
[22:30:12 INF] Request finished HTTP/2 GET https://localhost:5001/swagger/swagger-ui.css - - - 200 142933 text/css 192.6142ms
[22:30:13 INF] Request starting HTTP/2 GET https://localhost:5001/swagger/v1/swagger.json - -
[22:30:13 INF] Request finished HTTP/2 GET https://localhost:5001/swagger/v1/swagger.json - - - 200 - application/json;charset=utf-8 83.3874ms
[22:30:41 INF] Request starting HTTP/2 GET https://localhost:5001/Todos/00119201-3fed-4741-8295-48d697790729 - -
[22:30:41 INF] Executing endpoint 'Server.Controllers.TodosController.GetTodoById (Server)'
[22:30:41 INF] Route matched with {action = "GetTodoById", controller = "Todos"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetTodoById(System.Guid) on controller Server.Controllers.TodosController (Server).
[22:30:41 INF] Executing OkObjectResult, writing value of type 'System.Guid'.
[22:30:41 INF] Executed action Server.Controllers.TodosController.GetTodoById (Server) in 34.6663ms
[22:30:41 INF] Executed endpoint 'Server.Controllers.TodosController.GetTodoById (Server)'
[22:30:41 INF] Request finished HTTP/2 GET https://localhost:5001/Todos/00119201-3fed-4741-8295-48d697790729 - - - 200 - application/json;+charset=utf-8 121.1434ms

我不认为这是一种期望的行为(如果日志级别是信息而不是跟踪)。我错过了什么?如何防止 Serilog 在没有被要求的情况下记录?

我已经检查了这个问题Serilog - MinimumLoggingLevel Information shows every request in log - is that normal?,但这并没有帮助。未安装 Serilog.Web.Classic 包。

【问题讨论】:

    标签: c# serilog


    【解决方案1】:

    这些日志由 ASP .NET 主机以 Information 级别写入,因此 Serilog 也将它们作为 Information 接收。

    你可以做的是覆盖不同来源的MinimumLevel,这样你就可以继续接收一些来源写的Information级别的日志,同时忽略主机写的Information级别的日志。

    这是一个例子:

    • 将整体MinimumLevel 设置为Information
    • 仅针对来自 Microsoft 源的日志将 MinimumLevel 覆盖为 Warning
    • 仅针对来自 Microsoft.Hosting.Lifetime 源的日志将 MinimumLevel 覆盖为 Information

    例如

    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Information()
        .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
        .MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Information)
        .WriteTo.Console()
        .CreateLogger();
    

    您还可以通过appSettings.json 配置这些源覆盖:

    {
      "Serilog": {
        "MinimumLevel": {
          "Default": "Information",
          "Override": {
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
          }
        }
      },
      "AllowedHosts": "*"
    }
    

    【讨论】:

      【解决方案2】:

      您需要为"Microsoft.Hosting.Lifetime""Microsoft" 设置日志级别。我个人使用Serilog.Settings.Configuration 包,将.ReadFrom.Configuration(configuration) 添加到设置中,并将默认模板提供的值复制到配置中的Serilog.MinimumLevel.Override json 属性:

        "Serilog": {
          "MinimumLevel": {
            "Default": "Information",
            "Override": {
              "Microsoft": "Warning",
              "Microsoft.Hosting.Lifetime": "Information"
            }
          }
        },
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2016-11-04
        • 1970-01-01
        • 2022-11-06
        • 1970-01-01
        • 2017-05-24
        相关资源
        最近更新 更多