如何配置Serilog仅记录自定义Info级日志及高等级日志
问题
使用Serilog记录日志时,设置日志级别为Information后,大量框架自动生成的日志导致数据库膨胀。需要实现:
- 仅保留控制器中手动编写的
Information级日志 - 自动记录
Warning、Error等高等级日志
解决方案
核心是通过Serilog的过滤器规则,区分自定义日志与框架自动日志,具体配置如下:
核心修改:调整Serilog过滤器
替换原有的单一级别过滤规则,改为同时满足以下任一条件的日志才会被记录:
- 日志级别为
Warning及以上(包含Warning、Error、Fatal) - 日志级别为
Information,且日志来源属于你的项目控制器命名空间
修改后的完整配置代码
builder.Services.AddHttpLogging(logging => { logging.LoggingFields = HttpLoggingFields.All; logging.RequestHeaders.Add("sec-ch-ua"); logging.ResponseHeaders.Add("MyResponseHeader"); logging.MediaTypeOptions.AddText("application/javascript"); logging.RequestBodyLogLimit = 4096; logging.ResponseBodyLogLimit = 4096; }); // 自定义列配置保持不变 SqlColumn sqlColumn = new SqlColumn(); sqlColumn.ColumnName = "UserName"; sqlColumn.DataType = System.Data.SqlDbType.NVarChar; sqlColumn.PropertyName = "UserName"; sqlColumn.DataLength = 50; sqlColumn.AllowNull = true; ColumnOptions columnOpt = new ColumnOptions(); columnOpt.Store.Remove(StandardColumn.Properties); columnOpt.Store.Add(StandardColumn.LogEvent); columnOpt.AdditionalColumns = new Collection<SqlColumn> { sqlColumn }; Logger log = new LoggerConfiguration() .WriteTo.Console() .WriteTo.File("logs/log.txt") .WriteTo.MSSqlServer( connectionString: builder.Configuration.GetConnectionString("SqlCon"), sinkOptions: new MSSqlServerSinkOptions { AutoCreateSqlTable = true, TableName = "logs", }, appConfiguration: null, columnOptions: columnOpt ) .Enrich.FromLogContext() .Enrich.With<CustomUserNameColumn>() // 核心过滤逻辑 .Filter.ByIncludingOnly(logEvent => // 保留Warning及以上级别日志 logEvent.Level >= Serilog.Events.LogEventLevel.Warning || // 保留指定命名空间下的Information日志 (logEvent.Level == Serilog.Events.LogEventLevel.Information && logEvent.Properties.TryGetValue("SourceContext", out var sourceContext) && sourceContext.ToString().Contains("YourApp.Controllers"))) // 替换为实际控制器命名空间 .CreateLogger(); builder.Host.UseSerilog(log);
关键说明
- 命名空间匹配:将
YourApp.Controllers替换为你项目中控制器所在的实际命名空间(例如MyProject.Web.Controllers),确保只捕获你自己编写的控制器日志。 - 过滤器逻辑:既保证了高等级日志(Warning+)全部被记录,又过滤掉了框架自动生成的
Information级日志(如HTTP请求日志),只保留你手动调用logger.LogInformation产生的日志。 - 可选优化:如果不需要ASP.NET Core的HTTP请求日志,可以直接移除
builder.Services.AddHttpLogging(...)配置,进一步减少冗余日志。
内容的提问来源于stack exchange,提问作者Berk KARASU
相关产品推荐
相关产品推荐

