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

自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:17:08