.NET Core 2 ASP.NET应用中Rogue CurlException异常日志问题咨询
解答:处理.NET Core 2中AppInsights上报的CurlException问题
这是不是System.Net.Http的bug?
首先,这不太算是System.Net.Http的bug。你的场景里,代码已经正确将这个CurlException转化为了有效的Http响应消息,说明HttpClient本身已经处理了底层的异常情况。问题出在Application Insights(AI)的依赖追踪模块上——它监听了更低层级的异常事件,即便你的代码已经处理了这个异常,AI还是把它当成了一个失败的依赖调用上报了。
简单来说:System.Net.Http的行为是符合预期的(处理异常并返回响应),但AI的依赖追踪逻辑在这里过度捕捉了底层异常,导致日志被干扰。
如何在不禁用全部依赖追踪的前提下禁用该异常日志?
你可以通过自定义AI的遥测处理逻辑,精准过滤掉这类不需要上报的CurlException。下面是两种常用的方法:
方法1:自定义TelemetryInitializer
这个方法可以修改遥测数据,清除掉特定的异常标记,或者将依赖调用标记为成功:
public class FilterCurlExceptionInitializer : ITelemetryInitializer { public void Initialize(ITelemetry telemetry) { // 只处理依赖类型的遥测数据 if (telemetry is DependencyTelemetry dependencyTelemetry) { // 检查异常是否为CurlException if (dependencyTelemetry.Exception is System.Net.Http.CurlException) { // 根据你的业务逻辑判断:比如如果响应状态码是2xx,说明请求实际成功了 if (!string.IsNullOrEmpty(dependencyTelemetry.ResultCode) && dependencyTelemetry.ResultCode.StartsWith("2")) { // 清除异常,标记为成功 dependencyTelemetry.Exception = null; dependencyTelemetry.Success = true; } } } } }
然后在Startup.cs中注册这个Initializer:
public void ConfigureServices(IServiceCollection services) { services.AddApplicationInsightsTelemetry(); // 添加自定义的遥测初始化器 services.AddSingleton<ITelemetryInitializer, FilterCurlExceptionInitializer>(); // 其他服务配置... }
方法2:自定义TelemetryProcessor
这个方法可以直接过滤掉不需要上报的遥测数据,彻底阻止这类异常进入AppInsights:
public class FilterCurlExceptionProcessor : ITelemetryProcessor { private readonly ITelemetryProcessor _nextProcessor; public FilterCurlExceptionProcessor(ITelemetryProcessor nextProcessor) { _nextProcessor = nextProcessor; } public void Process(ITelemetry telemetryItem) { if (telemetryItem is DependencyTelemetry dependencyTelemetry) { // 如果是CurlException且请求实际成功,跳过上报 if (dependencyTelemetry.Exception is System.Net.Http.CurlException && dependencyTelemetry.ResultCode?.StartsWith("2") == true) { return; // 不传递这个遥测数据,即不上报 } } // 其他遥测数据正常传递 _nextProcessor.Process(telemetryItem); } }
注册这个Processor到Startup.cs:
public void ConfigureServices(IServiceCollection services) { services.AddApplicationInsightsTelemetry(); // 添加自定义遥测处理器 services.AddApplicationInsightsTelemetryProcessor<FilterCurlExceptionProcessor>(); // 其他服务配置... }
总结
这两种方法都能在保留其他依赖追踪功能的前提下,精准过滤掉那些干扰日志的CurlException上报。你可以根据自己的需求选择:如果只是不想看到异常标记但保留依赖记录,用Initializer;如果想彻底移除这类记录,用Processor。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

