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

.NET Core 3.1 Worker Service配置Serilog后安装为Windows服务无法写文件日志问题

解决方案
  • 工作目录不匹配
    Windows服务运行时默认工作目录为C:\Windows\System32,若你配置Serilog时使用相对路径输出日志,要么日志会被写入System32目录无法找到,要么服务运行身份无该目录写入权限导致写入失败。
    解决方法:在Main方法最开头将工作目录切换为程序部署目录,参考代码:
using System.Diagnostics;
using System.IO;

var mainModule = Process.GetCurrentProcess().MainModule;
if (mainModule != null)
{
    var exePath = mainModule.FileName;
    var deployDir = Path.GetDirectoryName(exePath);
    if (!string.IsNullOrEmpty(deployDir))
    {
        Directory.SetCurrentDirectory(deployDir);
    }
}

该修改同时能保证Host.CreateDefaultBuilder正确加载同目录下的appsettings.json配置文件。

  • Serilog注册方式异常
    当前使用的ConfigureLogging(logging => logging.AddSerilog())不是适配通用主机的推荐注册方式,建议改为在HostBuilder链上直接调用UseSerilog扩展方法,修改后的CreateHostBuilder代码参考:
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseSerilog() // 替换原有ConfigureLogging中AddSerilog的逻辑,需提前初始化Log.Logger静态实例
        .ConfigureServices((hostContext, services) =>
        {
            services.AddHostedService<Worker>();
        })
        .UseWindowsService();

若你通过appsettings.json配置Serilog规则,需确保初始化时读取了主机配置:

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(hostContext.Configuration)
    .CreateLogger();
  • 目录权限不足
    Windows服务默认以Local Service身份运行,需手动给程序部署目录添加该账户的写入权限:右键部署文件夹→属性→安全→编辑→添加→输入Local Service,校验名称后确认,勾选「写入」权限后保存即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:30:02