如何让Azure Web App的Asp.Net Core日志Scope显示在Azure Analytics中?
问题:ASP.NET Core 6应用Scope日志无法同步到Azure Log Analytics
当前环境:Windows App Service、.NET Core 6.0 ASP.NET Core应用
现状:
- 常规日志可在App Service Log Stream及Log Analytics的
AppServiceAppLogs表正常显示 - 使用
BeginScope添加的结构化字段(如示例中的user: Alex)未出现在日志中
测试代码:
using (logger.BeginScope(new Dictionary<string, object> { { "user" , "Alex" } })) { logger.LogInformation("Test Log"); }
已做配置(仅让Log Stream显示Scope,Log Analytics无效):
builder.Services.Configure<AzureFileLoggerOptions>(options => { options.IncludeScopes = true; });
额外尝试:使用Serilog本地可生成规范结构化JSON日志,但Azure Log Analytics和Log Stream仍无法显示Scope字段
解决方案
1. 原生ASP.NET Core日志配置调整
AzureFileLoggerOptions仅控制本地文件日志的Scope,对Log Analytics的日志管道无效,需配置Azure Monitor相关日志提供者:
// 添加Azure Web App诊断日志支持 builder.Logging.AddAzureWebAppDiagnostics(); // 配置Blob日志(Log Analytics依赖此管道)启用Scope builder.Services.Configure<AzureBlobLoggerOptions>(options => { options.IncludeScopes = true; }); // 确保日志过滤规则允许Scope相关日志输出 builder.Services.Configure<LoggerFilterOptions>(options => { options.AddFilter<Microsoft.Extensions.Logging.AzureAppServices.AzureAppServicesDiagnosticsLoggerProvider>("", LogLevel.Information); });
同时需在App Service的诊断设置中,确认日志已正确推送到Log Analytics工作区,并勾选应用日志、详细错误日志等相关类别。
2. Serilog正确配置方式
若使用Serilog,需确保对接Azure App Service日志接收器并启用Scope上下文:
先安装依赖NuGet包:
Install-Package Serilog.AspNetCore Install-Package Serilog.Sinks.AzureAppServices
在Program.cs中配置:
var logger = new LoggerConfiguration() .Enrich.FromLogContext() // 启用Scope上下文 enrichment .WriteTo.AzureAppServices(new AzureAppServicesSinkOptions { IncludeScopes = true, OutputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj} {Properties}{NewLine}{Exception}" }) .CreateLogger(); // 替换原生日志提供者 builder.Logging.ClearProviders(); builder.Logging.AddSerilog(logger);
补充App Service应用设置:
SERILOG__MINIMUMLEVEL:InformationASPNETCORE_ENVIRONMENT:Production(或对应运行环境)
3. Log Analytics中提取Scope字段
Scope中的结构化数据会被序列化到Properties字段(JSON格式),需用KQL函数解析:
AppServiceAppLogs | where Message contains "Test Log" | extend Properties = parse_json(Properties) | project TimeGenerated, Message, user = Properties.user
内容的提问来源于stack exchange,提问作者Bashir
相关产品推荐
相关产品推荐

