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
相关产品推荐
相关产品推荐

