You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:47:22