为何Azure App Service日志流中Serilog的LogWarning消息被标记为Information?
解决方案
这是因为Azure App Service日志流默认将控制台输出的所有日志标记为Information级别——Azure的日志收集器无法识别Serilog CompactJsonFormatter输出的@l级别字段,只会按自己的规则识别日志级别。
方法1:使用Azure专用的Serilog控制台格式化器
直接替换为AzureAppServiceConsoleFormatter,它会输出Azure能识别的级别前缀,确保日志流正确识别级别。需要确保已安装Serilog.Sinks.Console包,修改日志配置如下:
public static Serilog.ILogger ConfigureLogger() { return new LoggerConfiguration() .MinimumLevel.Information() .Enrich.WithMachineName() .WriteTo.Console(new AzureAppServiceConsoleFormatter()) // 替换格式化器 .WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day) .CreateLogger(); }
方法2:给CompactJsonFormatter添加级别前缀
如果想保留CompactJsonFormatter,可以在输出模板中添加Azure能识别的级别前缀,让日志流通过前缀判断级别:
.WriteTo.Console( outputTemplate: "[{Level:u3}] {Message:lj}{NewLine}{Exception}", formatter: new CompactJsonFormatter() )
输出日志会带上[WRN]、[INF]这类前缀,Azure日志流就能正确识别级别,过滤Warning日志时即可正常匹配。
额外建议
可以在appsettings.json中添加Serilog专属配置,让日志级别管理更规范(不强制,但推荐):
"Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft.AspNetCore": "Warning" } } }
内容的提问来源于stack exchange,提问作者SBAT
相关产品推荐
相关产品推荐

