.NET 8 ASP.NET应用实现OpenTelemetry日志/指标/追踪JSON控制台输出
解决.NET 8 ASP.NET应用中OpenTelemetry日志、指标、追踪的JSON控制台输出问题
核心问题原因
你的普通日志通过自定义JsonLogFormatter实现了JSON格式,但OpenTelemetry的追踪(Tracing)、指标(Metrics)使用独立的Console Exporter,默认输出为文本格式,需要单独配置JSON格式化规则。
分步解决方案
1. 安装必要NuGet包
确保项目已安装OpenTelemetry控制台导出器包:
dotnet add package OpenTelemetry.Exporter.Console
2. 配置追踪(Tracing)为JSON输出
修改OpenTelemetry追踪配置,为控制台导出器指定JSON格式化器:
otel.WithTracing(tracing => { tracing.AddAspNetCoreInstrumentation(); tracing.AddHttpClientInstrumentation(); // 启用JSON格式输出 tracing.AddConsoleExporter(options => { options.Formatter = new JsonConsoleExporterFormatter(); }); });
3. 配置指标(Metrics)为JSON输出
为Metrics模块添加控制台导出器并启用JSON格式:
otel.WithMetrics(metrics => metrics .AddAspNetCoreInstrumentation() .AddMeter("Microsoft.AspNetCore.Hosting") .AddMeter("Microsoft.AspNetCore.Server.Kestrel") // 添加JSON格式的指标导出 .AddConsoleExporter(options => { options.Formatter = new JsonConsoleExporterFormatter(); }) );
4. 统一OpenTelemetry日志的JSON格式
如果应用通过OpenTelemetry Logger Provider输出日志,可将其关联到已配置的LoggerFactory,或直接配置JSON导出:
otel.WithLogging(logging => { // 复用已有的JSON日志格式化配置 logging.SetLoggerFactory(loggerFactory); // 也可直接指定JSON导出器 // logging.AddConsoleExporter(options => options.Formatter = new JsonConsoleExporterFormatter()); });
完整修改后代码示例
var builder = WebApplication.CreateBuilder(args); var services = builder.Services; var configuration = builder.Configuration; // OpenTelemetry核心配置 var otel = services.AddOpenTelemetry(); // Metrics配置:JSON格式控制台导出 otel.WithMetrics(metrics => metrics .AddAspNetCoreInstrumentation() .AddMeter("Microsoft.AspNetCore.Hosting") .AddMeter("Microsoft.AspNetCore.Server.Kestrel") .AddConsoleExporter(options => { options.Formatter = new JsonConsoleExporterFormatter(); }) ); // Tracing配置:JSON格式控制台导出 otel.WithTracing(tracing => { tracing.AddAspNetCoreInstrumentation(); tracing.AddHttpClientInstrumentation(); tracing.AddConsoleExporter(options => { options.Formatter = new JsonConsoleExporterFormatter(); }); }); // Logging配置:统一JSON格式 otel.WithLogging(logging => { logging.SetLoggerFactory(loggerFactory); }); // 原有自定义JSON日志格式化配置 var loggerFactory = LoggerFactory.Create(builder => { builder.ClearProviders(); builder.AddConfiguration(configuration.GetSection("Logging")) .AddConsole(); builder.AddConsoleFormatter<JsonLogFormatter, JsonLogOptions>(); }); services.AddSingleton(loggerFactory); services.AddLogging(); var app = builder.Build(); // 后续应用中间件配置...
效果验证
修改完成后,OpenTelemetry的追踪、指标、日志都会以JSON格式输出到控制台,示例输出如下:
{"ActivityId":"8794488a000a8aa943fb4bd76b8becbe","SpanId":"bae785686698f263","TraceFlags":"Recorded","SourceName":"System.Net.Http","DisplayName":"GET","Kind":"Client",...} {"Name":"http.server.request.duration","Labels":{"http.method":"GET","http.route":"/api/values"},"Value":123.45,"Timestamp":"2024-03-14T19:38:23.2569003+01:00",...}
内容的提问来源于stack exchange,提问作者user1713059
相关产品推荐
相关产品推荐

