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

Serilog MSSqlServer Sink专属过滤配置问题求助

解决Serilog MSSqlServer Sink仅记录特定LogCategory日志的问题

核心原则

过滤规则必须绑定到MSSqlServer Sink本身,不能用全局过滤(会影响Console和File Sink)。以下是两种主流配置方式的正确写法:


1. 代码配置方式

在WriteTo.MSSqlServer的配置链中直接添加过滤规则,确保只包含LogCategory等于Telemetry的日志:

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console() // 不受过滤影响
    .WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day) // 不受过滤影响
    .WriteTo.MSSqlServer(
        connectionString: "YourConnectionString",
        sinkOptions: new MSSqlServerSinkOptions { TableName = "Logs" },
        columnOptions: new ColumnOptions { /* 你的自定义列配置 */ },
        // 关键:针对当前Sink添加过滤
        restrictedToMinimumLevel: LogEventLevel.Information,
        filter: (logEvent) => 
        {
            // 检查日志事件是否包含LogCategory属性,且值为Telemetry
            return logEvent.Properties.TryGetValue("LogCategory", out var value) &&
                   value.ToString().Trim('"') == "Telemetry";
        }
    )
    .CreateLogger();

如果你的LogCategory是通过LogContext注入的,改用以下过滤逻辑:

filter: (logEvent) => 
{
    return logEvent.Properties.ContainsKey("LogCategory") &&
           logEvent.Properties["LogCategory"].ToString().Trim('"') == "Telemetry";
}

2. 配置文件(appsettings.json)方式

在Serilog.WriteTo数组中,为MSSqlServer节点单独添加filter表达式:

{
  "Serilog": {
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "File",
        "Args": { "path": "logs/log-.txt", "rollingInterval": "Day" }
      },
      {
        "Name": "MSSqlServer",
        "Args": {
          "connectionString": "YourConnectionString",
          "tableName": "Logs",
          "columnOptionsSection": { /* 你的自定义列配置 */ },
          "filter": "StartsWith(Properties['LogCategory'], 'Telemetry')"
        }
      }
    ]
  }
}

注意:过滤表达式要匹配属性名的大小写,确保LogCategory和日志代码中添加的属性名完全一致。


排查要点

  • 检查日志代码是否正确添加了LogCategory属性,比如:
    // 正确示例:直接添加属性
    Log.Information("Telemetry data: {Data}", data, new { LogCategory = "Telemetry" });
    // 或使用ForContext注入
    Log.ForContext("LogCategory", "Telemetry").Information("Telemetry data: {Data}", data);
    
  • 确认之前的过滤规则没有逻辑错误(比如误写为ExcludingOnly而非IncludingOnly)。
  • 检查数据库表中是否有LogCategory列,确保属性能正确写入。

内容的提问来源于stack exchange,提问作者Codesmith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:39:58