如何防止Serilog将每一个小步骤自动记录为信息?



我想在。net 5 Web Api项目中使用Serilog。我安装了这些包

  • Serilog。AspNetCore v4.1.0
  • Serilog.Sinks。控制台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信息显示日志中的每个请求-这是正常的吗?但这无济于事。未安装Serilog.Web.Classic包。

这些日志是由asp.net主机以Information级别编写的,因此Serilog也将它们作为Information接收。

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

下面是一个例子:

  • 设置MinimumLevelInformation
  • 仅对来自Microsoft源的日志覆盖MinimumLevelWarning
  • 仅对来自Microsoft.Hosting.Lifetime源的日志覆盖MinimumLevelInformation

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)添加到设置中,并将默认模板提供的值复制到config中的Serilog.MinimumLevel.Overridejson属性:

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

我最终这样配置了Serilog来隐藏不相关的信息:

"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.AspNetCore.Hosting.Diagnostics": "Warning",
"Microsoft.AspNetCore.Mvc.RazorPages": "Warning",
"Microsoft.AspNetCore.Mvc.ViewFeatures": "Warning",
"Microsoft.AspNetCore.StaticFiles": "Warning",
// The migration is not applied, so what?
"Microsoft.EntityFrameworkCore.Migrations": "Warning",
// DbCommand executed, so what?
"Microsoft.EntityFrameworkCore.Database": "Warning",
"Microsoft.AspNetCore.Mvc.Infrastructure": "Warning"
}
},
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"path": "C:/Logs/DEBUG-{Date}.txt",
"rollingInterval": "Day"
},
"When": "Environment = 'Development'"
},
{
"Name": "File",
"Args": {
"path": "C:/Logs/RELEASE-{Date}.txt",
"rollingInterval": "Day"
},
"When": "Environment = 'Production'"
}
]
}

And the Program.cs:

using Serilog;
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
if (IsDevelopment())
{
webBuilder.UseUrls("http://0.0.0.0:5000", "https://0.0.0.0:5001");
}
}).UseSerilog((hostingContext, loggerConfiguration) =>
{
loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration);
});
}

执行"Home/Index"时的输出:

[16:03:19 INF] Now listening on: http://0.0.0.0:5000
[16:03:19 INF] Now listening on: https://0.0.0.0:5001
[16:03:19 INF] Application started. Press Ctrl+C to shut down.
[16:03:19 INF] Hosting environment: Development
[16:03:19 INF] Content root path: O:VCSharpMVCSolutionMVCApplication
[16:03:22 INF] Executing endpoint 'MVCApplication.Controllers.HomeController.Index (MVCApplication)'
[16:03:26 INF] Executed endpoint 'MVCApplication.Controllers.HomeController.Index (MVCApplication)'

最新更新