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

.NET 6 Blazor WASM托管项目API控制器Serilog不记录日志问题

问题诊断与解决方案

核心问题分析

你的API控制器中Log.Debug()无法写入日志,主要有两个关键原因:

  1. 全局日志级别未配置,默认过滤Debug日志
    Serilog的日志过滤逻辑是先全局过滤,再执行Sink级别的过滤。你当前仅给File和MSSQL Sink设置了restrictedToMinimumLevel: Debug,但未设置全局最低日志级别,Serilog默认全局级别为Information,导致Debug级别的日志在全局阶段就被过滤,无法到达Sink。

  2. 控制器使用静态Log类而非框架推荐的依赖注入ILogger<T>
    直接使用Serilog静态Log类虽然可行,但不符合ASP.NET Core的日志集成规范,容易出现配置不一致的问题,且无法自动获取控制器上下文信息。


解决方案

方案1:修正Serilog全局日志级别配置

在LoggerConfiguration中添加全局最低级别设置,确保Debug日志能通过全局过滤:

修改Program.cs中的日志配置代码:

Log.Logger = new LoggerConfiguration()
        // 添加全局最低级别设置,允许Debug及以上级别日志
        .MinimumLevel.Debug()
        .WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Month, restrictedToMinimumLevel: logEventLevelFile)
        .WriteTo.MSSqlServer(
            connectionString: configuration.GetSection("Serilog:ConnectionStrings:LogDatabase").Value,
            restrictedToMinimumLevel: logEventLevelDB,
            sinkOptions: new MSSqlServerSinkOptions
            {
                TableName = configuration.GetSection("Serilog:TableName").Value,
                SchemaName = configuration.GetSection("Serilog:SchemaName").Value
            },
            appConfiguration: configuration,
            columnOptionsSection: configuration.GetSection("Serilog:ColumnOptions"))
        .CreateBootstrapLogger();

如果需要从配置文件读取全局级别,可在appsettings.json中新增配置项:

"Serilog": {
    "Using": [ "Serilog.Sinks.MSSqlServer" ],
    "MinimumLevel": "Debug", // 新增全局日志级别
    "MinimumLevelFile": "Debug",
    "MinimumLevelDB": "Debug",
    "ConnectionStrings": {
      "LogDatabase": "...valid connection string ..."
    },
    "SchemaName": "dbo",
    "TableName": "Logs"
  }

然后在代码中读取并应用:

var globalLogLevel = (Serilog.Events.LogEventLevel)Enum.Parse(typeof(Serilog.Events.LogEventLevel), configuration.GetSection("Serilog:MinimumLevel").Value);

Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Is(globalLogLevel)
        .WriteTo.File(/* 原有配置 */)
        .WriteTo.MSSqlServer(/* 原有配置 */)
        .CreateBootstrapLogger();

方案2:使用ASP.NET Core推荐的依赖注入ILogger<T>(优先选择)

修改控制器代码,通过构造函数注入ILogger<UserController>,替代静态Log类:

private readonly ILogger<UserController> _logger;

// 通过构造函数注入日志实例
public UserController(ILogger<UserController> logger)
{
    _logger = logger;
}

// GET: api/user
[AllowAnonymous]
[HttpGet]
public IActionResult Get(string empId)
{
    // 使用注入的Logger记录日志
    _logger.LogDebug($"{HttpContext.Request.Path} => Loading current user from Query String: {empId}");
    // 其他业务代码...
}

这种方式符合ASP.NET Core的依赖注入规范,能自动集成Serilog配置,还会将控制器类型信息作为日志上下文,更便于问题排查。


额外排查建议

你已开启Serilog的SelfLog,可通过Debug窗口查看是否有配置错误(如数据库连接失败、日志表不存在等),这些信息能快速定位Sink层面的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:10:28