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

ASP.NET Core 8 Web API部署IIS后Serilog无法写入日志

ASP.NET Core 8 Web API部署到IIS后Serilog无法生成日志文件的排查思路

问题背景

开发ASP.NET Core 8 Web API项目,使用Serilog同时向控制台和文件输出日志,本地Visual Studio运行时日志正常生成,但发布到IIS后,指定路径C:\NotificationSystemLogs下无日志文件生成,应用可正常访问,但Serilog静默不写入文件。

现有配置

appsettings.json中的Serilog配置

"Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "MinimumLevel": {
        "Default": "Information",
        "Override": {
            "Microsoft": "Warning",
            "System": "Warning"
        }
    },
    "WriteTo": [
        { "Name": "Console" },
        { "Name": "File",
            "Args": {
                "path": "C:\\NotificationSystemLogs\\log-.txt",
                "rollingInterval": "Day",
                "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
            }
        }
    ],
    "Enrich": [ "FromLogContext" ],
    "Properties": {
        "Application": "NotificationSystem"
    }
}

Program.cs中的代码

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .CreateBootstrapLogger();

Log.Information("Starting up...");

builder.Host.UseSerilog((ctx, services, configuration) =>
    new LoggerConfiguration()
        .ReadFrom.Configuration(ctx.Configuration)
        .ReadFrom.Services(services)
        .Enrich.FromLogContext()
        .CreateLogger()
);

已尝试的排查步骤

  • 手动创建C:\NotificationSystemLogs文件夹并赋予Everyone完全权限
  • 为IIS应用池标识APPPOOL\NotificationSystem授予文件夹修改权限
  • 确认appsettings.json中路径使用双反斜杠格式正确
  • 尝试从后台服务和中间件写入日志,无输出
  • 启用SelfLog.Enable(...)调试Serilog,未捕获到错误

环境信息

  • ASP.NET Core 8 Web API
  • 托管于IIS(Windows Server)
  • 应用池标识:ApplicationPoolIdentity
  • 日志文件夹路径:C:\NotificationSystemLogs

排查思路

结合现有排查结果,可从以下方向进一步定位问题:

  1. BootstrapLogger与正式Logger的配置冲突
    当前BootstrapLogger仅配置了控制台输出,后续通过UseSerilog加载配置时可能存在初始化顺序问题。可调整代码,让Bootstrap阶段也读取配置文件,确保启动日志能写入文件:

    var builder = WebApplication.CreateBuilder(args);
    
    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(builder.Configuration)
        .CreateBootstrapLogger();
    
    Log.Information("Starting up...");
    
    builder.Host.UseSerilog((ctx, services, config) => config
        .ReadFrom.Configuration(ctx.Configuration)
        .ReadFrom.Services(services)
        .Enrich.FromLogContext());
    
  2. IIS进程的实际权限限制
    即使配置了应用池权限,Windows Server的UAC或文件夹继承权限可能未生效。可尝试:

    • 将日志路径改为网站根目录下的相对路径(如.\Logs\log-.txt),避开系统盘根目录的严格权限限制
    • 临时将应用池标识改为LocalSystem(仅测试用),验证是否为权限问题
  3. 生产环境配置覆盖问题
    检查发布到IIS后的appsettings.Production.json是否覆盖了Serilog的File配置,比如移除了File Sink或修改了路径,确保生产环境配置中包含完整的File写入节点。

  4. 路径解析问题
    尝试在配置中使用正斜杠路径(C:/NotificationSystemLogs/log-.txt),避免双反斜杠可能的解析异常;或使用环境变量动态指定路径,增强兼容性。

  5. 组件版本兼容性
    确认Serilog.Sinks.File、Serilog.AspNetCore等依赖包的版本与ASP.NET Core 8兼容,更新到最新稳定版本后重新部署测试。

  6. IIS stdout日志排查
    启用IIS的stdout日志,查看是否有Serilog初始化相关的错误输出。在web.config中添加:

    <aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    

    查看生成的stdout日志,定位是否存在未捕获的初始化异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:53:11