.NET中指定命名空间/方法后OTEL日志级别覆盖不生效
问题:OpenTelemetry日志中Information级别日志无法发送到Application Insights
我正在使用OTEL(OpenTelemetry)记录日志,并将日志和指标发送至Application Insights。目前遇到的问题是:MyMethod中的Warning级别日志能正常写入Application Insights,但即便在配置中覆盖了默认级别,Information级别日志始终无法被记录。
相关代码展示
1. OpenTelemetry配置代码
public static class OpenTelemetrySetup { public static IOpenTelemetryBuilder AddOpenTelemetryDefaults(this IServiceCollection service, IConfiguration configuration) { if(options.LoggingOptions.LogExporters.Length > 0) { service.AddLogging(logging => { if(options.LoggingOptions.ClearProviders) { logging.ClearProviders(); } logging.AddFilter("Case", LogLevel.Information); logging.AddOpenTelemetry(openTelLogOptions => { openTelLogOptions .SetLoggingOptionsFromConfig(options.LoggingOptions) .AddLogExportersFromConfig(options); }); }); } } }
2. Web API启动类中的调用代码
// OTEL services.AddLogging(logging => logging.AddConfiguration(context.Configuration.GetSection("Logging"))); IOpenTelemetryBuilder otelBuilder = services.AddOpenTelemetryDefaults(configService).WithTracing(tracingOptions => { tracingOptions.AddProcessor(new CodeProcessor()); }); otelBuilder.WithNoTracingForStaticFiles(); otelBuilder.WithNoTracingForDependencyHealthEndpoints();
3. Appsettings.json中的日志级别配置
"LogLevel": { "Default": "Warning", "Microsoft": "Critical", "Microsoft.Hosting.Lifetime": "Critical", "MyNameSpace.MyMethod": "Information" }
4. 业务代码中的日志调用
MyMethod{ this.logger.LogWarningWithProperties($"message", properties); // 正常工作 this.logger.LogInformationWithProperties($"message", properties); // 无法记录 }
排查与解决建议
1. 修正OTEL过滤规则的作用范围
你当前添加的过滤规则logging.AddFilter("Case", LogLevel.Information)仅针对Case命名空间生效,而业务代码属于MyNameSpace,需要添加对应命名空间的过滤规则:
// 在AddLogging的配置块中添加 logging.AddFilter("MyNameSpace", LogLevel.Information);
2. 检查OTEL独立配置文件的优先级
OTEL的独立setting.json可能存在全局日志级别配置,覆盖了Appsettings.json的设置。打开该文件,确认是否存在针对MyNameSpace.MyMethod或全局的日志级别限制,确保其最低级别设置为Information。
3. 直接在OTEL日志配置中强制指定级别
可以在OTEL日志配置中显式设置最低捕获级别,避免配置文件的优先级冲突:
logging.AddOpenTelemetry(openTelLogOptions => { openTelLogOptions .SetLoggingOptionsFromConfig(options.LoggingOptions) .AddLogExportersFromConfig(options) // 全局最低捕获级别 .SetMinimumLevel(LogLevel.Information) // 针对目标命名空间细化级别 .AddFilter("MyNameSpace", LogLevel.Information); });
4. 验证自定义日志扩展方法的实现
检查LogInformationWithProperties这个自定义扩展方法,确保它正确调用了ILogger原生的LogInformation方法,没有在内部逻辑中过滤掉Information级别的日志。
内容的提问来源于stack exchange,提问作者S2K
相关产品推荐
相关产品推荐

