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

.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": "===&gt; {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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:12:32