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
相关产品推荐
相关产品推荐

