如何在使用NLog的ASP.NET Core 3.1项目中禁用Hangfire日志?
问题原因
你原先的配置未生效的核心原因如下:
- appsettings.json中
Logging:LogLevel下的配置属于Microsoft.Extensions.Logging(MEL)层的过滤规则,仅作用于MEL默认的日志管道 - 你代码中硬编码的
LoggingRule("*", LogLevel.Trace, LogLevel.Fatal, myCustomTarget)是NLog层的全局规则,优先级高于MEL的过滤配置,会直接采集所有来源的日志,包括Hangfire输出的内容,因此MEL层的Hangfire禁用配置不会生效。
解决方案
可以仅通过appsettings.json实现禁用需求,无需编写NLog规则、过滤器代码,也无需自定义Hangfire的NoOpLogger,操作步骤如下:
- 移除代码中硬编码的NLog规则:删除你现有代码中定义的那条LoggingRule,改为让NLog从appsettings.json加载所有规则配置
- 在appsettings.json中新增NLog配置段:在原有配置基础上添加NLog的目标和规则配置,优先配置Hangfire的拦截规则:
{ "Logging": { "LogLevel": { "Default": "Information", "Hangfire": "None" } }, "NLog": { "targets": { "myCustomTarget": { // 此处填写你之前自定义Target的配置参数,和代码中原myCustomTarget的配置保持一致 "type": "你的自定义Target注册名称" } }, "rules": [ // 第一条规则拦截所有Hangfire相关日志,不输出,并且标记为final终止后续规则匹配 { "logger": "Hangfire*", "minLevel": "Trace", "maxLevel": "Fatal", "final": true, "writeTo": "" }, // 第二条规则匹配所有其他日志,输出到自定义Target { "logger": "*", "minLevel": "Trace", "maxLevel": "Fatal", "writeTo": "myCustomTarget" } ] } }
- 调整NLog初始化逻辑:在Program.cs的NLog初始化部分,改为从appsettings加载NLog配置:
var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); LogManager.Configuration = new NLogLoggingConfiguration(config.GetSection("NLog"));
注意事项
如果你坚持保留代码中硬编码的全局NLog规则,则无法仅通过appsettings.json的原生配置实现Hangfire日志禁用,必须修改硬编码规则添加过滤逻辑。
内容的提问来源于stack exchange,提问作者Hussein Dahir
相关产品推荐
相关产品推荐

