.NET 7 Minimal API中OpenTelemetry AttachLogsToActivityEvent丢失FormattedMessage
ILogger日志附加到Activity Event时FormattedMessage丢失问题
使用OpenTelemetry.Contrib.Preview包将ILogger独立日志附加为Activity Events(即Trace事件),实现日志与Trace关联,以便在Jaeger等工具中统一展示。按照文档要求,已在日志配置中调用AttachLogsToActivityEvent并设置IncludeFormattedMessage = true,但日志成功附加到Activity后,仅记录了CategoryName、LogLevel和EventId三个默认属性,实际的FormattedMessage并未被记录。尝试过相关问题的解决方案但无效,已提交问题到对应仓库。
项目csproj文件
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net7.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0-*" /> <PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="7.0.0" /> <PackageReference Include="OpenTelemetry.Contrib.Preview" Version="1.0.0-beta2" /> <PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.4.0-rc.1" /> <PackageReference Include="OpenTelemetry.Exporter.Jaeger" Version="1.4.0-rc.1" /> <PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.4.0-rc.1" /> <PackageReference Include="OpenTelemetry.Exporter.Prometheus.HttpListener" Version="1.4.0-rc.1" /> <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.4.0-rc.1" /> <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs" Version="1.4.0-rc.1" /> <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.4.0-rc.1" /> <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.0.0-rc9.10" /> <PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.0.0-rc9.10" /> <PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.1.0-beta.2" /> </ItemGroup> </Project>
Program.cs文件
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using OpenTelemetry; using OpenTelemetry.Exporter; using OpenTelemetry.Instrumentation.AspNetCore; using OpenTelemetry.Logs; using OpenTelemetry.Resources; using OpenTelemetry.Trace; using System; var builder = WebApplication.CreateBuilder(args); var services = builder.Services; services.AddProblemDetails(); services.AddEndpointsApiExplorer(); services.AddApiVersioning(options => options.ReportApiVersions = true) .AddApiExplorer( options => { options.GroupNameFormat = "'v'VVV"; options.SubstituteApiVersionInUrl = true; }) .EnableApiVersionBinding(); services.AddSwaggerGen(); builder.Services.Configure<AspNetCoreInstrumentationOptions>(options => options.RecordException = true); var resource = ResourceBuilder.CreateDefault().AddService("MyService"); builder.Services .AddOpenTelemetry() .ConfigureResource(ConfigureResource) .WithTracing(o => { o.SetSampler(new TraceIdRatioBasedSampler(1.0)) .AddSource("MyService") .AddAspNetCoreInstrumentation(option => option.RecordException = true) .AddHttpClientInstrumentation(); o.AddConsoleExporter(o => o.Targets = ConsoleExporterOutputTargets.Console); }).StartWithHost(); builder.Logging.ClearProviders(); builder.Logging.Configure(o => o.ActivityTrackingOptions = ActivityTrackingOptions.SpanId | ActivityTrackingOptions.TraceId | ActivityTrackingOptions.ParentId); builder.Logging.AddFilter<OpenTelemetryLoggerProvider>("*", LogLevel.Information); builder.Logging .AddOpenTelemetry(loggerOptions => { loggerOptions.SetResourceBuilder(resource); loggerOptions.IncludeFormattedMessage = true; loggerOptions.IncludeScopes = true; loggerOptions.ParseStateValues = true; loggerOptions.AddConsoleExporter(); loggerOptions.AttachLogsToActivityEvent(); }); var app = builder.Build(); var common = app.NewVersionedApi("Common"); var commonV1 = common.MapGroup("/api/v{version:apiVersion}/common").HasApiVersion(1.0); commonV1.MapGet("/", (ILogger<Program> logger) => { logger.LogInformation("Calling hello world api!"); return Results.Ok("Hello World common v1!"); }); app.UseSwagger(); app.UseSwaggerUI( options => { var descriptions = app.DescribeApiVersions(); foreach (var description in descriptions) { var url = $"/swagger/{description.GroupName}/swagger.json"; var name = description.GroupName.ToUpperInvariant(); options.SwaggerEndpoint(url, name); } }); app.Run(); static void ConfigureResource(ResourceBuilder r) => r.AddService( serviceName: "MyService", serviceVersion: "1.0.0", serviceInstanceId: Environment.MachineName);
运行程序并调用端点后,Activity已记录附加的日志事件,但未包含实际的FormattedMessage属性。
内容的提问来源于stack exchange,提问作者SanjayD
相关产品推荐
相关产品推荐

