.NET 6结合Serilog:如何仅记录应用代码显式编写的日志?
仅记录应用代码显式编写的Serilog日志(.NET 6)
要过滤掉.NET系统生成的日志,只保留自己代码里显式编写的日志,核心是通过日志来源命名空间进行筛选——系统日志基本来自Microsoft、System开头的命名空间,而你的应用代码有专属的命名空间前缀,据此过滤即可。
方法1:通过appsettings.json配置
方式A:直接禁用系统命名空间日志
在Serilog配置中,通过MinimumLevel.Override将Microsoft和System的日志级别设为None,彻底屏蔽这些来源的日志:
{ "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "None", "System": "None" } }, "WriteTo": [ { "Name": "MSSqlServer", "Args": { "connectionString": "你的数据库连接字符串", "tableName": "Logs" } } ] } }
方式B:仅包含应用自身命名空间日志
如果需要更精确的控制,只保留你应用的命名空间(比如YourApp开头的),可以用Filter规则:
{ "Serilog": { "MinimumLevel": "Information", "Filter": [ { "Name": "ByIncludingOnly", "Args": { "expression": "SourceContext like 'YourApp%'" } } ], "WriteTo": [ { "Name": "MSSqlServer", "Args": { "connectionString": "你的数据库连接字符串", "tableName": "Logs" } } ] } }
SourceContext是Serilog自动记录的日志来源类的命名空间,通过like匹配你的应用前缀,仅保留符合条件的日志。
方法2:通过代码配置(Program.cs)
如果偏好代码方式控制,可以在UseSerilog中添加过滤逻辑:
var builder = WebApplication.CreateBuilder(args); builder.Host.UseSerilog((context, config) => { config .ReadFrom.Configuration(context.Configuration) // 排除Microsoft和System开头的日志 .Filter.ByExcluding(logEvent => logEvent.Properties.TryGetValue("SourceContext", out var sourceCtx) && (sourceCtx.ToString().StartsWith("\"Microsoft") || sourceCtx.ToString().StartsWith("\"System"))) .WriteTo.MSSqlServer( connectionString: context.Configuration.GetConnectionString("YourDbConn"), tableName: "Logs"); }); var app = builder.Build(); // 其他中间件配置...
注意事项
- 确保你的代码中是通过依赖注入获取
ILogger<T>实例,这样SourceContext会自动设为当前类的命名空间,过滤规则才能正确匹配。 - 如果有第三方库的日志需要排除,可在过滤规则中添加对应的命名空间(比如
ThirdPartyLib)。
内容的提问来源于stack exchange,提问作者M_Idrees
相关产品推荐
相关产品推荐

