如何通过配置自定义ILogger<T>的日志级别?
解决Serilog下禁用特定ILogger日志的问题
你遇到的问题根源在于:Serilog和微软原生日志配置体系相互独立,你在Logging.LogLevel里设置的规则,Serilog并不会直接应用。要针对ILogger<DataHandledLoggingHandler>禁用日志,得在Serilog的专属配置里做处理,具体方法如下:
方法一:通过Serilog配置节点覆盖级别
在appsettings.Development.json中找到或新增Serilog节点,用MinimumLevel.Override指定目标类的日志级别。注意必须使用完整的命名空间+类名,因为ILogger<T>对应的日志上下文(SourceContext)就是T的完整类型名。
示例配置:
{ "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft.AspNetCore": "Warning", "你的命名空间.DataHandledLoggingHandler": "Verbose" } }, "WriteTo": [ { "Name": "Console" }, { "Name": "Seq", "Args": { "serverUrl": "http://localhost:5341" } } ] }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } } }
Serilog没有None级别,这里用Verbose替代——只要你的日志接收器(Console/Seq)没有开启Verbose级别的接收,该类的日志就会被完全过滤掉。
方法二:通过Serilog Filter直接排除日志
如果要更彻底禁用,还可以用Serilog的过滤规则直接排除该类的所有日志:
在Serilog节点下添加Filters配置:
{ "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft.AspNetCore": "Warning" } }, "Filters": [ { "Name": "ByExcluding", "Args": { "expression": "SourceContext = '你的命名空间.DataHandledLoggingHandler'" } } ], "WriteTo": [ { "Name": "Console" }, { "Name": "Seq", "Args": { "serverUrl": "http://localhost:5341" } } ] } }
这个规则会直接把所有来源上下文为DataHandledLoggingHandler完整类型名的日志排除,不会进入任何接收器。
代码配置方式(如果不用JSON配置)
如果你的Serilog是通过代码初始化的,也可以在Program.cs里直接添加过滤规则:
builder.Host.UseSerilog((context, config) => { config.ReadFrom.Configuration(context.Configuration) // 方法一:覆盖级别 .MinimumLevel.Override("你的命名空间.DataHandledLoggingHandler", Serilog.Events.LogEventLevel.Verbose) // 方法二:直接排除 .Filter.ByExcluding(evt => evt.SourceContext == "你的命名空间.DataHandledLoggingHandler"); });
内容的提问来源于stack exchange,提问作者Sossenbinder
相关产品推荐
相关产品推荐

