如何防止 Serilog 自动将每一个小步骤记录为信息?
How to prevent Serilog from logging every little step as information automatically?
我想为我的 .Net 5 Web Api 项目使用 Serilog。我安装了软件包
- 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 软件包未安装。
这些日志由级别为 Information
的 ASP .NET 主机写入,因此 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": "*"
}
您需要为 "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"
}
}
},
我想为我的 .Net 5 Web Api 项目使用 Serilog。我安装了软件包
- 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 软件包未安装。
这些日志由级别为 Information
的 ASP .NET 主机写入,因此 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": "*"
}
您需要为 "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"
}
}
},