You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Serilog仅记录自定义Info级日志及高等级日志

问题

使用Serilog记录日志时,设置日志级别为Information后,大量框架自动生成的日志导致数据库膨胀。需要实现:

  • 仅保留控制器中手动编写的Information级日志
  • 自动记录Warning、Error等高等级日志
解决方案

核心是通过Serilog的过滤器规则,区分自定义日志与框架自动日志,具体配置如下:

核心修改:调整Serilog过滤器

替换原有的单一级别过滤规则,改为同时满足以下任一条件的日志才会被记录:

  1. 日志级别为Warning及以上(包含Warning、Error、Fatal)
  2. 日志级别为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:55:17