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

ASP.NET Core 3.1多IIS实例Serilog共享日志配置及延迟写入问题

解决ASP.NET Core 3.1中Serilog的两个配置问题

针对你遇到的两个Serilog问题,以下是具体的解决方案和修改后的配置:


问题1:日志仅在首次请求后写入文件

原因

当前Serilog初始化时机较晚,主机启动阶段的日志未被捕获,且File Sink默认延迟创建文件,直到第一个日志事件触发。

解决方法

在Main方法中提前初始化Serilog,捕获启动日志并强制触发文件创建:

修改后的Program.cs:

public class Program
{
    public static void Main(string[] args)
    {
        // 提前初始化Serilog,确保启动日志被捕获
        Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
        Directory.CreateDirectory("Logs");

        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.Serilog.json", optional: false, reloadOnChange: true)
            .Build();

        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .Enrich.FromLogContext()
            .CreateLogger();

        try
        {
            Log.Information("Web主机启动中");
            CreateHostBuilder(args).Build().Run();
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Web主机意外终止");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseSerilog() // 直接使用已初始化的Serilog实例
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

问题2:多IIS实例无冲突写入共享日志文件

关键配置要点

  1. 使用绝对共享路径:替换相对路径为UNC共享路径(或本地绝对路径),确保所有实例指向同一文件
  2. 确认shared: true生效:该参数启用多进程共享写入模式
  3. 可选:添加刷新间隔:确保日志及时写入磁盘,避免内存积压

修改后的appsettings.Serilog.json:

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Using": [
      "Serilog.Sinks.File"
    ],
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "Path": "\\\\共享服务器地址\\SharedLogs\\log-{Date}.log", // JSON需转义反斜杠,替换为实际共享路径
          "shared": true,
          "RollingInterval": "Day",
          "RetainedFileCountLimit": null,
          "flushToDiskInterval": 1, // 每秒刷新一次到磁盘,可选
          "formatter": {
            "type": "Serilog.Templates.ExpressionTemplate, Serilog.Expressions",
            "template": "[{@t:yyyy-MM-dd HH:mm:ss} {@l:u3}] {@m}\n{@x}"
          }
        }
      }
    ]
  }
}

额外注意事项

  • 确保所有IIS应用池的运行身份拥有共享文件夹的读写权限
  • 升级Serilog.Sinks.File包到v4.0及以上版本,确保共享模式稳定支持
  • 滚动日志命名中加入{Date},避免单文件过大,同时多实例写入时自动处理文件切换逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 20:24:59