自定义Serilog包装器下控制台无法输出LogDebug日志的问题咨询
解决ASP.NET Core自定义Serilog包装器无法输出Debug日志的问题
以下是针对性的解决方案,按步骤排查并修复:
1. 检查自定义Logger的级别过滤逻辑
自定义CustomLogger必须正确实现日志级别校验,否则会拦截Debug日志。确保IsEnabled方法严格遵循全局配置的最小级别:
public class CustomLogger : ILogger { private readonly ILogger _serilogLogger; private readonly LogLevel _minimumLevel; public CustomLogger(string categoryName, LogLevel minimumLevel) { _minimumLevel = minimumLevel; // 初始化Serilog时必须指定Debug级别,并配置控制台输出 _serilogLogger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console() .CreateLogger(); } // 核心:校验当前日志级别是否允许输出 public bool IsEnabled(LogLevel logLevel) { return logLevel >= _minimumLevel; } public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { if (!IsEnabled(logLevel)) return; // 转换ASP.NET Core级别到Serilog对应级别 var serilogLevel = logLevel switch { LogLevel.Trace => Serilog.Events.LogEventLevel.Verbose, LogLevel.Debug => Serilog.Events.LogEventLevel.Debug, LogLevel.Information => Serilog.Events.LogEventLevel.Information, LogLevel.Warning => Serilog.Events.LogEventLevel.Warning, LogLevel.Error => Serilog.Events.LogEventLevel.Error, LogLevel.Critical => Serilog.Events.LogEventLevel.Fatal, _ => Serilog.Events.LogEventLevel.Information }; _serilogLogger.Write(serilogLevel, exception, formatter(state, exception)); } public IDisposable BeginScope<TState>(TState state) => NullScope.Instance; }
2. 正确传递全局配置的最小级别到Provider
CustomLoggerProvider需要从配置中读取全局最小级别,并传递给每个Logger实例:
public class CustomLoggerProvider : ILoggerProvider { private readonly LogLevel _globalMinimumLevel; private readonly ConcurrentDictionary<string, CustomLogger> _loggers = new(); public CustomLoggerProvider(LogLevel globalMinimumLevel) { _globalMinimumLevel = globalMinimumLevel; } public ILogger CreateLogger(string categoryName) { return _loggers.GetOrAdd(categoryName, _ => new CustomLogger(categoryName, _globalMinimumLevel)); } public void Dispose() => _loggers.Clear(); }
3. 在Program.cs中正确注册自定义Provider
不要使用builder.Host.UseSerilog()(会覆盖所有Provider),改为手动注册自定义Provider并读取配置级别:
var builder = WebApplication.CreateBuilder(args); // 从appsettings.json读取全局最小日志级别 var minimumLevel = builder.Configuration.GetValue<LogLevel>("Logging:LogLevel:Default", LogLevel.Debug); // 注册自定义Serilog包装器Provider builder.Logging.AddProvider(new CustomLoggerProvider(minimumLevel)); var app = builder.Build(); // 测试Debug日志输出 app.MapGet("/", (ILogger<Program> logger) => { logger.LogDebug("Test debug"); return "Debug log sent to console"; }); app.Run();
4. 确认appsettings.json配置正确
确保配置文件中的日志级别设置为Debug:
{ "Logging": { "LogLevel": { "Default": "Debug", "Microsoft.AspNetCore": "Warning" } } }
如果需要更灵活的Serilog配置(比如从文件读取Sink和级别),可以修改CustomLogger的初始化逻辑:
// 替换Serilog初始化代码,读取配置文件中的Serilog节点 _serilogLogger = new LoggerConfiguration() .ReadFrom.Configuration(builder.Configuration) .CreateLogger();
同时在appsettings.json中添加Serilog配置:
"Serilog": { "MinimumLevel": { "Default": "Debug", "Override": { "Microsoft": "Warning", "System": "Warning" } }, "WriteTo": [ { "Name": "Console" } ] }
内容的提问来源于stack exchange,提问作者Vadim Tomashevsky
相关产品推荐
相关产品推荐

