.NET 6 Blazor WASM托管项目API控制器Serilog不记录日志问题
问题诊断与解决方案
核心问题分析
你的API控制器中Log.Debug()无法写入日志,主要有两个关键原因:
全局日志级别未配置,默认过滤Debug日志
Serilog的日志过滤逻辑是先全局过滤,再执行Sink级别的过滤。你当前仅给File和MSSQL Sink设置了restrictedToMinimumLevel: Debug,但未设置全局最低日志级别,Serilog默认全局级别为Information,导致Debug级别的日志在全局阶段就被过滤,无法到达Sink。控制器使用静态
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
相关产品推荐
相关产品推荐

