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

.NET 8 Blazor Server下ASP.NET ILogger获取日志提供程序及LogLevel设置方法

.NET 8 Blazor Server中获取日志提供程序及日志级别配置的方法

1. 获取所有已注册的日志提供程序

ASP.NET Core会将所有注册的日志提供程序以IEnumerable<ILoggerProvider>的形式注入到依赖容器中,你可以直接获取这个集合查看当前运行的所有日志提供程序:

实现示例

在Program.cs应用构建完成后(或任意服务中注入IEnumerable<ILoggerProvider>)添加以下代码:

var app = builder.Build();

// 获取所有日志提供程序
using var scope = app.Services.CreateScope();
var loggerProviders = scope.ServiceProvider.GetRequiredService<IEnumerable<ILoggerProvider>>();

// 输出所有提供程序类型
var logger = app.Services.GetRequiredService<ILogger<Program>>();
logger.LogInformation("已注册的日志提供程序列表:");
foreach (var provider in loggerProviders)
{
    logger.LogInformation("- {ProviderType}", provider.GetType().FullName);
}

2. 获取每个提供程序对应的LogLevel设置

日志级别过滤规则由LoggerFilterOptions管理,你可以通过IOptions<LoggerFilterOptions>获取全局日志级别配置;针对自定义提供程序(如你的AzureBlobLogger),还需检查其自身的配置选项:

全局日志级别获取

var filterOptions = scope.ServiceProvider.GetRequiredService<IOptions<LoggerFilterOptions>>().Value;
logger.LogInformation("全局日志过滤规则:");
foreach (var rule in filterOptions.Rules)
{
    var providerName = rule.ProviderName ?? "所有提供程序";
    var categoryName = rule.CategoryName ?? "所有类别";
    logger.LogInformation("- 提供程序:{Provider},类别:{Category},最低日志级别:{Level}", 
        providerName, categoryName, rule.LogLevel);
}

自定义提供程序的级别配置

如果你的AzureBlobLogger有自定义级别配置选项(比如AzureBlobLoggerOptions),直接读取对应配置即可:

var blobLoggerOptions = scope.ServiceProvider.GetRequiredService<IOptions<AzureBlobLoggerOptions>>().Value;
logger.LogInformation("AzureBlobLogger 配置:最低日志级别={Level},Blob容器={Container}",
    blobLoggerOptions.LogLevel, blobLoggerOptions.ContainerName);

3. 验证AzureBlobLogger的连接状态

要确认自定义AzureBlobLogger是否成功连接到Azure Blob存储,可通过两种方式实现:

方法一:在自定义提供程序中添加连接检查

修改AzureBlobLoggerProvider的构造函数,添加初始化时的连接验证:

public class AzureBlobLoggerProvider : ILoggerProvider
{
    private readonly AzureBlobLoggerOptions _options;
    private readonly BlobServiceClient _blobServiceClient;

    public AzureBlobLoggerProvider(IOptions<AzureBlobLoggerOptions> options)
    {
        _options = options.Value;
        _blobServiceClient = new BlobServiceClient(_options.ConnectionString);
        
        // 测试连接:尝试获取容器(不存在则创建)
        try
        {
            var container = _blobServiceClient.GetBlobContainerClient(_options.ContainerName);
            container.CreateIfNotExists(PublicAccessType.None);
            // 记录连接成功日志
            var logger = CreateLogger(nameof(AzureBlobLoggerProvider));
            logger.LogInformation("AzureBlobLogger 已成功连接到Blob存储容器:{Container}", _options.ContainerName);
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException("AzureBlobLogger 连接Blob存储失败", ex);
        }
    }

    // 其他实现代码...
}

方法二:在应用启动后主动测试

// 在Program.cs中获取AzureBlobLoggerProvider并测试
var blobProvider = loggerProviders.OfType<AzureBlobLoggerProvider>().FirstOrDefault();
if (blobProvider != null)
{
    // 假设你的提供程序有TestConnection方法
    var isConnected = blobProvider.TestConnection();
    logger.LogInformation("AzureBlobLogger 连接状态:{Status}", isConnected ? "成功" : "失败");
}

4. 排查日志级别被覆盖的问题

如果遇到日志级别被未知覆盖的情况,按以下步骤排查:

  • 检查appsettings.json/appsettings.{Environment}.json中的Logging节点,确认是否有全局或针对特定提供程序的级别配置:
    "Logging": {
      "LogLevel": {
        "Default": "Information",
        "Microsoft.AspNetCore": "Warning"
      },
      "AzureBlobLogger": {
        "LogLevel": {
          "Default": "Error"
        }
      }
    }
    
  • 检查代码中是否调用了AddFilter方法,这类代码会直接覆盖配置文件的设置:
    builder.Logging.AddFilter<AzureBlobLoggerProvider>(category: null, LogLevel.Error);
    
  • 确认第三方日志提供程序(如ApplicationInsights)是否有默认级别过滤规则,部分提供程序会自带默认过滤逻辑。

内容的提问来源于stack exchange,提问作者David Thielen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:32:44