.NET Core 3.1 WebAPI中Serilog依赖注入无输出排查求助
排查.NET Core 3.1 WebAPI中Serilog无输出的问题
结合你给出的配置细节,核心问题出在Serilog与ASP.NET Core日志系统的集成方式以及配置结构上,下面一步步拆解修复:
1. 初始化时机与集成方式错误
你目前在Startup.cs的ConfigureServices里手动初始化Log.Logger并注册单例,但ASP.NET Core的日志系统默认不会自动关联Serilog——必须显式替换默认日志提供器,而且初始化动作应该放在程序启动的更早阶段(Program.cs)。
修复步骤:修改Program.cs
把Serilog的配置移到Program.cs,用UseSerilog方法完成与ASP.NET Core的集成:
using Serilog; public class Program { public static int Main(string[] args) { // 先初始化一个临时Logger,捕获启动过程中的日志 Log.Logger = new LoggerConfiguration() .WriteTo.Console() .CreateLogger(); try { Log.Information("WebAPI启动中..."); CreateHostBuilder(args).Build().Run(); return 0; } catch (Exception ex) { Log.Fatal(ex, "WebAPI意外终止"); return 1; } finally { Log.CloseAndFlush(); } } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) // 关键:用Serilog替换默认日志提供器 .UseSerilog((context, loggerConfig) => loggerConfig.ReadFrom.Configuration(context.Configuration)) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
2. 移除Startup中多余的注册代码
删除Startup.cs里的以下代码,因为UseSerilog已经自动完成了Serilog与ILogger<T>的关联,手动注册单例反而可能导致冲突:
services.AddSingleton(Log.Logger); // 以及这段手动初始化Logger的代码: var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddJsonFile($"appsettings.Development.json", optional: true, reloadOnChange: true) .Build(); Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .CreateLogger();
3. 检查appsettings.json的配置结构
你的配置片段缺少Serilog根节点——Serilog从配置文件读取时,只会识别Serilog节点下的配置。正确的结构应该是:
{ "Serilog": { "MinimumLevel": "Debug", "WriteTo": [ { "Name": "Console", "Args": { "outputTemplate": "===> {Timestamp:HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}" } }, { "Name": "Loggly", "Args": { "customerToken": "MySuperSecretKey" } } ] } }
4. 确认安装了必要的NuGet包
确保你的项目安装了以下包(缺一不可):
Serilog.AspNetCore:负责Serilog与ASP.NET Core日志系统的集成Serilog.Settings.Configuration:支持从appsettings读取配置Serilog.Sinks.Console:控制台输出接收器Serilog.Sinks.Loggly:Loggly输出接收器
可以通过NuGet包管理器或者命令行安装:
Install-Package Serilog.AspNetCore Install-Package Serilog.Settings.Configuration Install-Package Serilog.Sinks.Console Install-Package Serilog.Sinks.Loggly
验证修复
做完以上修改后,启动WebAPI并触发Login attempt的日志调用,应该能在控制台看到格式化的日志输出,同时日志也会同步到Loggly。如果还是有问题,可以在控制器构造函数里加个断点,查看_log的实际类型——如果是Serilog.AspNetCore.SerilogLogger<T>,说明集成成功;如果是默认的Microsoft.Extensions.Logging.Logger<T>,则需要检查UseSerilog是否正确调用。
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

