.NET 8使用IExceptionHandler出现重复异常日志问题求助
解决.NET 8中IExceptionHandler重复日志问题
你遇到的重复日志问题,是因为.NET 8的ExceptionHandler中间件默认集成了DiagnosticsTelemetry组件,它会在自定义异常处理器执行前,先记录一条来自Microsoft.AspNetCore.Diagnostics.DiagnosticsTelemetry.ReportUnhandledException的异常日志。要实现单条异常日志,有以下两种可行方案:
方案一:过滤指定类别的日志(推荐)
通过日志配置直接屏蔽DiagnosticsTelemetry相关的日志输出,这是最安全且无副作用的方式。
如果你使用NLog配置文件(nlog.config)
在<rules>节点中添加一条优先级更高的规则,直接关闭该类别的日志:
<rules> <!-- 优先关闭DiagnosticsTelemetry的日志,final="true"表示后续规则不再处理该日志 --> <logger name="Microsoft.AspNetCore.Diagnostics.DiagnosticsTelemetry" minlevel="Off" final="true" /> <!-- 你的其他日志规则 --> <logger name="*" minlevel="Trace" writeTo="yourLogTarget" /> </rules>
如果你使用appsettings.json配置日志
在配置文件中添加Logging节点,将指定类别的日志级别设为None:
{ "Logging": { "LogLevel": { "Microsoft.AspNetCore.Diagnostics.DiagnosticsTelemetry": "None" } } }
方案二:移除DiagnosticsTelemetry服务
如果确认不需要DiagnosticsTelemetry的其他功能,可以直接从服务容器中移除该服务:
在Program.cs的服务注册部分添加:
builder.Services.RemoveAll<DiagnosticsTelemetry>();
注意:此方法可能影响ASP.NET Core的其他遥测相关功能,需谨慎使用。
另外,检查你的自定义GlobalExceptionHandler,确保TryHandleAsync返回true(你当前代码已经做到了),这会告诉框架异常已被处理,避免后续其他默认处理逻辑触发,但DiagnosticsTelemetry的日志是在自定义处理器执行前触发的,所以必须通过上述方法屏蔽。
内容的提问来源于stack exchange,提问作者ClemB
相关产品推荐
相关产品推荐

