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

Azure Functions日志异常:堆栈跟踪在Application Insights中生成独立条目

解决Azure Functions中Serilog异常堆栈拆分问题

问题根源

当前Serilog配置使用了TelemetryConverter.Traces转换器,该转换器会将异常的每一行堆栈跟踪拆分为独立的Trace条目发送到Application Insights,导致日志被拆分。

可行解决方案

方案1:改用事件转换器

修改Serilog配置中的Application Insights写入器,将TelemetryConverter.Traces替换为TelemetryConverter.Events,这样会把包含完整堆栈的异常作为单个Event条目发送:

.WriteTo.ApplicationInsights(sp.GetRequiredService<TelemetryClient>(), TelemetryConverter.Events, LogEventLevel.Warning)

方案2:自定义Trace转换器保留完整堆栈

若需继续使用Trace类型日志,可自定义转换器确保异常完整堆栈包含在单条日志中:

public static class CustomTelemetryConverter
{
    public static IEnumerable<ITelemetry> ConvertTraceWithFullException(LogEvent logEvent, IFormatProvider formatProvider)
    {
        var trace = new TraceTelemetry(logEvent.RenderMessage(formatProvider), MapLogLevelToSeverity(logEvent.Level));
        
        if (logEvent.Exception != null)
        {
            trace.Properties["FullException"] = logEvent.Exception.ToString();
        }
        
        // 追加所有日志属性
        foreach (var property in logEvent.Properties)
        {
            trace.Properties[property.Key] = property.Value.ToString();
        }
        
        yield return trace;
    }

    private static SeverityLevel MapLogLevelToSeverity(LogEventLevel level)
    {
        return level switch
        {
            LogEventLevel.Verbose => SeverityLevel.Verbose,
            LogEventLevel.Debug => SeverityLevel.Verbose,
            LogEventLevel.Information => SeverityLevel.Information,
            LogEventLevel.Warning => SeverityLevel.Warning,
            LogEventLevel.Error => SeverityLevel.Error,
            LogEventLevel.Fatal => SeverityLevel.Critical,
            _ => SeverityLevel.Information
        };
    }
}

然后在Serilog配置中引用该自定义转换器:

.WriteTo.ApplicationInsights(sp.GetRequiredService<TelemetryClient>(), CustomTelemetryConverter.ConvertTraceWithFullException, LogEventLevel.Warning)

方案3:规范异常记录方式

确保代码中记录异常时,将异常对象作为参数传入日志方法,让Serilog绑定完整异常信息:

try
{
    // 业务逻辑代码
}
catch (Exception ex)
{
    Log.Error(ex, "执行过程中发生异常");
}

补充优化:调整host.json采样配置

确认host.json中的采样设置不会干扰日志聚合,可合理调整每秒最大遥测条目数避免丢失:

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request",
        "maxTelemetryItemsPerSecond": 500
      },
      "enableLiveMetricsFilters": true
    }
  },
  "extensions": {
    "http": {
      "routePrefix": ""
    }
  }
}

验证方式

部署修改后的代码,触发异常后进入Application Insights的日志面板,查询traces或customEvents表,确认异常堆栈是否完整包含在单条日志条目中。

内容的提问来源于stack exchange,提问作者Piotr Palej

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:35:18