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

Serilog无法读取appsettings.json中Logging节点配置的问题咨询

问题解决:Serilog日志级别配置不生效

问题描述

我在使用Serilog配置日志时,发现appsettings.json中的日志级别设置完全不生效,日志始终默认使用Information级别。我的代码和两种尝试过的配置如下:

日志配置代码:

var loggerConfig = new LoggerConfiguration()
        //.MinimumLevel
        //.Information() //These are not working from appsettings.json possibly because we are using Serilog?
        //.MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database.Command", LogEventLevel.Warning)
        .ReadFrom.Configuration(configuration,"Logging")
        .WriteTo.Console()
        .WriteTo.File(
            $"{configuration.GetValue<string>("logFilePath")}{DateTime.Now.Date:yyyy_MM_dd}_{assemblyName}.log");
        
var logger = loggerConfig.CreateLogger();

services.AddLogging(loggingBuilder =>
    {
        loggingBuilder.ClearProviders();
        loggingBuilder.AddSerilog(logger);
    });

第一种尝试的appsettings.json配置:

"Logging": {
    "LogLevel": {
      "Default": "Debug",
      "Microsoft": "Information",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.EntityFrameworkCore.Database.Command": "Warning"
    }
}

第二种尝试的配置:

"Logging": {
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "System": "Information",
        "Microsoft": "Information",
        "Microsoft.Hosting.Lifetime": "Information",
        "Microsoft.EntityFrameworkCore": "Warning"
      }
    }
}

原因分析

  1. 配置结构不匹配:Serilog的配置规则和ASP.NET Core默认的Logging节点结构不同,直接读取Logging节点无法正确解析级别设置。
  2. 默认级别 fallback:Serilog如果未正确读取到级别配置,会默认使用Information作为最低日志级别。
  3. 依赖包缺失:若未安装Serilog.Settings.Configuration包,ReadFrom.Configuration方法无法正常加载配置。

解决方案

步骤1:安装必要依赖包

确保项目中已安装以下NuGet包:

  • Serilog.AspNetCore
  • Serilog.Settings.Configuration

步骤2:使用Serilog专用配置节点(推荐)

修改appsettings.json,添加Serilog专属配置节点,结构完全匹配Serilog的解析要求:

"Serilog": {
  "MinimumLevel": {
    "Default": "Debug",
    "Override": {
      "Microsoft": "Information",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.EntityFrameworkCore.Database.Command": "Warning"
    }
  },
  "WriteTo": [
    { "Name": "Console" }
    // 若要在配置中定义文件输出,可添加以下配置,否则保留代码中的WriteTo.File即可
    // {
    //   "Name": "File",
    //   "Args": {
    //     "path": "logs/your_assembly_name_.log",
    //     "rollingInterval": "Day"
    //   }
    // }
  ]
}

步骤3:调整代码读取正确配置节点

修改日志配置代码,让Serilog读取默认的Serilog节点:

var loggerConfig = new LoggerConfiguration()
        .ReadFrom.Configuration(configuration) // 无需指定节点,默认读取"Serilog"节点
        .WriteTo.File(
            $"{configuration.GetValue<string>("logFilePath")}{DateTime.Now.Date:yyyy_MM_dd}_{assemblyName}.log");
        
var logger = loggerConfig.CreateLogger();

services.AddLogging(loggingBuilder =>
    {
        loggingBuilder.ClearProviders();
        loggingBuilder.AddSerilog(logger);
    });

可选:若坚持使用现有Logging节点

如果不想新增Serilog节点,需要调整Logging节点的结构完全匹配Serilog的MinimumLevel格式,并且确保代码中读取时Serilog能正确解析:

"Logging": {
  "MinimumLevel": {
    "Default": "Debug",
    "Override": {
      "Microsoft": "Information",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.EntityFrameworkCore.Database.Command": "Warning"
    }
  }
}

同时代码中保持.ReadFrom.Configuration(configuration, "Logging"),但这种方式容易和ASP.NET Core默认日志配置混淆,不推荐。

验证

启动项目后,尝试输出Debug级别的日志,确认是否能正常记录;同时检查EF Core的数据库命令日志是否仅输出Warning及以上级别,验证配置是否生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:13:17