.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
相关产品推荐
相关产品推荐

