You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:40:50