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

.NET 6 Web API中Serilog配置及日志路径、多目标输出问题

.NET 6 Web API Serilog配置及GreyLog对接问题解决方案

1. 让Serilog全局生效(控制器可正常使用)

核心是将Serilog替换为ASP.NET Core的默认日志提供器,按以下步骤配置:

  1. 安装必要NuGet包:

    Install-Package Serilog.AspNetCore
    
  2. 在Program.cs中先初始化Serilog,再替换默认日志提供器:

    using Serilog;
    
    // 初始化Serilog配置
    Log.Logger = new LoggerConfiguration()
        .WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day)
        .CreateLogger();
    
    try
    {
        var builder = WebApplication.CreateBuilder(args);
    
        // 替换默认日志提供器为Serilog
        builder.Host.UseSerilog();
    
        // 正常配置控制器及其他服务
        builder.Services.AddControllers();
        // ...其他服务配置
    
        var app = builder.Build();
        // ...中间件配置
    
        app.Run();
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "应用启动失败");
    }
    finally
    {
        Log.CloseAndFlush();
    }
    

    完成后,控制器中直接注入ILogger<AdminController>即可使用Serilog,无需额外操作。

2. 正确映射日志路径(替代.NET Framework的MapPath)

手动注入IWebHostEnvironment拼接路径是正确的,推荐两种更规范的实现方式:

方式一:代码中动态拼接路径

利用IWebHostEnvironment的ContentRootPath(项目根目录)或WebRootPath(wwwroot目录)拼接:

var contentRootPath = builder.Environment.ContentRootPath;
var logFilePath = Path.Combine(contentRootPath, "logs", "old_project_.log");

// 配置Serilog时使用该路径
Log.Logger = new LoggerConfiguration()
    .WriteTo.File(logFilePath, rollingInterval: RollingInterval.Day)
    .CreateLogger();

方式二:通过配置文件指定路径

在appsettings.json中添加Serilog配置:

{
  "Serilog": {
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "logs/old_project_.log",
          "rollingInterval": "Day"
        }
      }
    ]
  }
}

然后在Program.cs中读取配置:

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(builder.Configuration)
    .CreateLogger();

此处相对路径默认基于项目根目录,和.NET Framework的MapPath(@"~/")效果一致。

3. 用现有ILogger同时输出文件和GreyLog

完全可以实现,只需给Serilog添加多个输出目标(Sink):

  1. 安装GreyLog的Serilog Sink包:

    Install-Package Serilog.Sinks.GrayLog
    
  2. 在Serilog配置中同时添加文件和GreyLog输出:

    Log.Logger = new LoggerConfiguration()
        // 文件输出
        .WriteTo.File(Path.Combine(builder.Environment.ContentRootPath, "logs", "old_project_.log"), rollingInterval: RollingInterval.Day)
        // GreyLog输出,替换为你的服务地址
        .WriteTo.GrayLog(new GrayLogSinkOptions
        {
            HostnameOrAddress = "你的GreyLog服务器IP/域名",
            Port = 12201 // 默认GELF UDP端口
        })
        .CreateLogger();
    

    配置完成后,控制器中ILogger<AdminController>输出的所有日志会同时发送到文件和GreyLog,无需修改控制器的日志代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:55:15