ASP.NET Core使用log4net启用Microsoft.AspNetCore DEBUG日志的配置疑问
1. 为什么加了appsettings.json的Logging配置才能看到Debug日志
ASP.NET Core 日志体系存在两层过滤规则,日志消息会依次经过两层校验才会最终输出:
第一层是宿主全局过滤层:由
WebHost.CreateDefaultBuilder默认加载appsettings.json的Logging配置、环境变量、命令行参数中的日志规则,所有日志首先经过这层过滤,不符合级别的日志会直接被丢弃,不会发送给后续注册的日志Provider(包括log4net)。
第二层是Provider过滤层:也就是你配置的log4net规则,只有通过第一层过滤的日志,才会进入log4net的规则校验。
默认情况下,ASP.NET Core 全局过滤规则中Microsoft前缀的日志最小级别是Information,所以Debug级别的日志在第一层就被拦截了,根本到不了log4net,哪怕你log4net配置了Debug级别也不会生效。你添加的配置就是修改了第一层全局过滤规则,放开了Microsoft前缀的Debug日志限制,日志才能流入log4net处理。
2. 现有配置缺少的内容(对应两个需求)
需求1:禁用Azure应用服务的大量HTTP请求日志
分两种场景处理:
- 如果是应用自身输出的请求日志:这些日志来自
Microsoft.AspNetCore.Hosting.Diagnostics等组件,你可以在log4net配置中添加如下规则过滤:
<logger name="Microsoft.AspNetCore.Hosting.Diagnostics" additivity="false"> <level value="Warn" /> <appender-ref ref="Console" /> </logger>
低于Warn级别的请求日志(包含GET/POST请求信息)会被log4net直接过滤。
- 如果是Azure平台自带的IIS日志:这部分日志是Azure应用服务默认采集的Web服务器日志,和你的应用log4net配置无关,需要登录Azure门户,进入对应应用服务的「应用服务日志」页面,关闭「Web服务器日志」开关即可。
需求2:记录Microsoft.AspNetCore命名空间下的DEBUG级别日志
你现有配置已经可以实现,建议做一处优化:把appsettings.json中的Logging配置更改为更精确的匹配,避免不必要的其他Microsoft组件Debug日志输出:
"Logging": { "LogLevel": { "Microsoft.AspNetCore": "Debug", "Microsoft": "Information" } }
这样只会放开Microsoft.AspNetCore前缀的Debug级别日志到第一层过滤,其他Microsoft组件(如EF Core、Identity等)的日志还是保持Info级别,减少无用日志。
3. 使用log4net是否需要保留appsettings.json的Logging配置段
可以不用保留,你可以直接在Program.cs的ConfigureLogging方法中硬编码全局过滤规则,替代appsettings的配置,示例如下:
.ConfigureLogging((logging) => { logging.ClearProviders(); // 手动设置全局过滤规则,替代appsettings配置 logging.SetMinimumLevel(LogLevel.Information); logging.AddFilter("Microsoft.AspNetCore", LogLevel.Debug); logging.AddLog4Net(); })
保留Logging配置段的优势是支持热更新、修改日志规则无需重新编译发布,更灵活。
内容的提问来源于stack exchange,提问作者Maroun

