.NET 5 搭配NLog实现网络跟踪无法获取详细日志求助
.NET 5+ 开启详细网络跟踪方案
原来.NET Framework的配置式网络跟踪在.NET Core及以上版本中已经废弃,你当前通过ILogger+NLog只能捕获到HttpClient的高层日志,底层套接字、SSL握手等数据走的是EventSource/EventListener 机制,默认不会输出到ILogger管道,因此需要额外配置:
方案1:集成到现有NLog日志体系(不需要额外工具)
通过自定义EventListener捕获系统网络组件的底层事件,再转发到NLog输出。
步骤1:实现自定义网络跟踪监听器
using System.Diagnostics.Tracing; using Microsoft.Extensions.Logging; internal sealed class NetworkTraceListener : EventListener { private readonly ILogger _logger; public NetworkTraceListener(ILogger<NetworkTraceListener> logger) { _logger = logger; } protected override void OnEventSourceCreated(EventSource eventSource) { // 匹配所有网络相关的系统事件源 if (eventSource.Name.StartsWith("System.Net")) { // 启用Verbose等级+全关键词才能拿到SSL握手、套接字收发等完整细节 EnableEvents(eventSource, EventLevel.Verbose, EventKeywords.All); } } protected override void OnEventWritten(EventWrittenEventArgs eventData) { if (!_logger.IsEnabled(LogLevel.Trace)) return; // 格式化事件负载输出 var payloadStr = string.Join(" | ", eventData.PayloadNames .Zip(eventData.Payload, (name, value) => $"{name}: {value}")); _logger.LogTrace("[{Source}] {EventName} >> {Payload}", eventData.EventSource.Name, eventData.EventName, payloadStr); } }
步骤2:注册监听器到依赖注入容器
修改你的Host构建代码,注册监听器即可生效:
return Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging.ClearProviders(); logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); logging.AddNLog(logConfig); }) .ConfigureServices(services => { // 注册网络跟踪监听器,程序启动后会自动开始捕获事件 services.AddSingleton<NetworkTraceListener>(); }) .Build();
你现有的NLog规则已经配置了System*前缀的Trace级别日志输出,后续所有网络底层事件都会自动写入你配置的日志文件,包含SSL版本协商、证书校验结果、套接字连接状态、收发字节统计等完整数据。
方案2:临时排查用(无需修改代码)
如果只是临时排查问题,可以使用官方命令行工具直接挂载进程捕获网络日志:
- 安装工具:
dotnet tool install --global dotnet-trace - 找到你的程序进程ID后执行捕获命令:
dotnet trace collect --process-id 你的进程ID --providers "System.Net:0xFFFFFFFFFFFFFFFF:5,System.Net.Sockets:0xFFFFFFFFFFFFFFFF:5,System.Net.Security:0xFFFFFFFFFFFFFFFF:5"
- 停止捕获后会生成nettrace格式文件,用Visual Studio或者PerfView即可打开查看全部网络跟踪细节。
注意:Verbose级别的网络跟踪会产生极大量日志,仅建议排查问题时临时启用,禁止在生产环境长期开启,避免占用过多磁盘IO和内存资源。
内容的提问来源于stack exchange,提问作者DavidWaldo
相关产品推荐
相关产品推荐

