在.NET 8的Serilog中按类型分文件存储日志的实现方法
解决方案
一、修正appsettings.json配置
你需要在WriteTo数组中添加两个独立的File sink,分别配置过滤规则对应不同日志文件。以下是完整可生效的配置:
{ "Serilog": { "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Filters.Expressions" // 必须添加此依赖,否则过滤表达式无效 ], "MinimumLevel": { "Default": "Information", "Override": { "Microsoft.AspNetCore.Mvc": "Warning", "Microsoft.AspNetCore.Routing": "Warning", "Microsoft.AspNetCore.Hosting": "Warning" } }, "WriteTo": [ { "Name": "Console" }, // EF Core查询日志专属sink { "Name": "File", "Args": { "path": "Logs/log-.txt", "rollingInterval": "Day", "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}", "fileSizeLimitBytes": 10485760, "rollOnFileSizeLimit": true, "shared": true, "flushToDiskInterval": 1 }, "Filter": [ { "Name": "ByIncluding", "Args": { "expression": "StartsWith(SourceContext, 'Microsoft.EntityFrameworkCore.Database')" } } ] }, // API请求日志专属sink { "Name": "File", "Args": { "path": "Logs/request-.txt", "rollingInterval": "Day", "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {RequestPath} {Message:lj}{NewLine}{Exception}", "fileSizeLimitBytes": 10485760, "rollOnFileSizeLimit": true, "shared": true, "flushToDiskInterval": 1 }, "Filter": [ { "Name": "ByIncluding", "Args": { "expression": "StartsWith(SourceContext, 'YourProjectNamespace.Controllers') or Contains(SourceContext, 'Microsoft.AspNetCore.HttpLogging')" } } ] } ], "Enrich": [ "FromLogContext" ] }, "AllowedHosts": "*" }
关键注意事项:
- 执行命令安装缺失的过滤包:
dotnet add package Serilog.Filters.Expressions - API日志的过滤表达式需根据实际调整:
- 替换
YourProjectNamespace.Controllers为你项目中控制器的命名空间 - 若需捕获完整HTTP请求日志,需先在Program.cs中启用
AddHttpLogging和UseHttpLogging中间件
- 替换
二、Program.cs代码配置方案
如果配置文件方式仍有问题,可直接通过代码硬编码实现,逻辑更直观:
using Serilog; using Serilog.Filters; var builder = WebApplication.CreateBuilder(args); // 配置Serilog builder.Host.UseSerilog((context, config) => { config .MinimumLevel.Information() .MinimumLevel.Override("Microsoft.AspNetCore.Mvc", Serilog.Events.LogEventLevel.Warning) .MinimumLevel.Override("Microsoft.AspNetCore.Routing", Serilog.Events.LogEventLevel.Warning) .MinimumLevel.Override("Microsoft.AspNetCore.Hosting", Serilog.Events.LogEventLevel.Warning) .Enrich.FromLogContext() // 输出到控制台 .WriteTo.Console() // EF Core日志输出到log-.txt .WriteTo.File( path: "Logs/log-.txt", rollingInterval: RollingInterval.Day, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}", fileSizeLimitBytes: 10485760, rollOnFileSizeLimit: true, shared: true, flushToDiskInterval: TimeSpan.FromSeconds(1)) .Filter.ByIncludingOnly(evt => evt.SourceContext?.StartsWith("Microsoft.EntityFrameworkCore.Database") == true) // API请求日志输出到request-.txt .WriteTo.File( path: "Logs/request-.txt", rollingInterval: RollingInterval.Day, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {RequestPath} {Message:lj}{NewLine}{Exception}", fileSizeLimitBytes: 10485760, rollOnFileSizeLimit: true, shared: true, flushToDiskInterval: TimeSpan.FromSeconds(1)) .Filter.ByIncludingOnly(evt => evt.SourceContext != null && (evt.SourceContext.StartsWith("YourProjectNamespace.Controllers") || evt.SourceContext.Contains("Microsoft.AspNetCore.HttpLogging"))); }); // 启用HTTP请求日志捕获(可选,如需完整请求信息) builder.Services.AddHttpLogging(options => { options.LoggingFields = Microsoft.AspNetCore.HttpLogging.HttpLoggingFields.All; }); builder.Services.AddControllers(); var app = builder.Build(); // 启用HTTP日志中间件 app.UseHttpLogging(); app.UseAuthorization(); app.MapControllers(); app.Run();
代码配置说明:
- 通过
Filter.ByIncludingOnly为每个File sink单独设置过滤规则 - 若需捕获完整HTTP请求/响应数据,必须添加
AddHttpLogging和UseHttpLogging中间件
内容的提问来源于stack exchange,提问作者JOYBOY
相关产品推荐
相关产品推荐

