使用Serilog为Azure App Insights加自定义属性及上下游不显示问题排查
问题:Serilog自定义属性无法在Azure App Insights跨层级/同OperationID日志中显示
我想用Serilog给Azure App Insights的自定义事件添加自定义属性,但遇到了以下问题:在基础设施层的下游类中通过代码推送自定义属性后,中间件、API层等上游类无法找到该属性,且同一OperationID/RequestId的Azure App Insights日志中也看不到这个属性。
代码示例
public async Task<T> GetFromCacheAsync<T>(string key) where T: class { var stopwatch = Stopwatch.StartNew(); var cachedResponse = await _distributedCache.GetStringAsync(key); if (string.IsNullOrEmpty(cachedResponse)) { return null; } LogContext.PushProperty(IS_CACHED_RESPONSE, "True"); Log.Information($"Fetched the response from azure cache for redis with Cache Key: {key} in Time: {stopwatch.Elapsed}"); return JsonConvert.DeserializeObject<T>(cachedResponse); }
日志截图说明
- 推送自定义属性的Azure App Insights日志:显示自定义属性已成功推送的日志截图
- 同一OperationID/RequestId下的Azure App Insights日志:同请求ID但未显示自定义属性的日志截图
解决方案
1. 启用Serilog的LogContext增强
Serilog的LogContext需要在初始化时显式启用,否则自定义属性不会被附加到日志事件中。在Serilog配置代码中添加Enrich.FromLogContext():
Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() // 必须配置此选项 .WriteTo.ApplicationInsights(TelemetryConfiguration.CreateDefault(), TelemetryConverter.Traces) .CreateLogger();
2. 用using管理属性作用域
LogContext.PushProperty()返回的IDisposable对象必须正确释放,确保属性仅在目标作用域内生效,同时避免上下文泄漏。修改你的缓存方法代码:
public async Task<T> GetFromCacheAsync<T>(string key) where T: class { var stopwatch = Stopwatch.StartNew(); var cachedResponse = await _distributedCache.GetStringAsync(key); if (string.IsNullOrEmpty(cachedResponse)) { return null; } // 使用using块限定属性作用域 using (LogContext.PushProperty(IS_CACHED_RESPONSE, "True")) { Log.Information($"Fetched the response from azure cache for redis with Cache Key: {key} in Time: {stopwatch.Elapsed}"); } return JsonConvert.DeserializeObject<T>(cachedResponse); }
这样自定义属性会被正确附加到该using块内的日志事件中。
3. 确保请求上下文的异步传递
如果需要让自定义属性关联到整个请求的OperationID,需保证ASP.NET Core的请求上下文在异步操作中正确传递:
- 默认ASP.NET Core会自动处理异步上下文传递,但若存在自定义线程操作,需使用
ConfigureAwait(true)确保上下文延续。 - 可使用Serilog的
RequestLoggingMiddleware,自动将请求ID、OperationID等上下文信息关联到所有日志事件中。
4. 验证App Insights属性映射
检查Serilog的App Insights Sink配置,确保自定义属性未被过滤:
- 默认情况下,Serilog的自定义属性会作为App Insights的自定义维度发送。
- 若使用了自定义
TelemetryConverter,需确保该转换器没有忽略或过滤掉这些属性。
内容的提问来源于stack exchange,提问作者Akash Temburniker
相关产品推荐
相关产品推荐

