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

.NET6 Windows服务安装后无法创建写入Serilog日志文件怎么办

故障核心原因

相对路径解析错位,和目录权限无关:
直接双击运行exe时,进程默认工作目录就是exe所在的应用程序根目录,配置里的Logs/log-{Date}.txt会被正确拼接为应用根目录下的日志路径,所以日志写入正常。
注册为Windows服务后,系统为服务进程初始化的默认工作目录是C:\Windows\System32,相对路径会被拼接在这个System32目录下,和你提前在应用根目录创建的Logs文件夹、给LOCAL SERVICE分配的权限完全不匹配,自然无法写入预期位置的日志文件。
Windows事件日志不受影响是因为它的写入路径是系统固定的绝对路径,不存在路径解析偏差,所以你能在事件查看器里正常看到服务相关报错。

修复方案

按以下步骤调整即可:

  • 废弃直接读取配置中相对路径作为日志写入地址的逻辑,.NET 6环境下用AppContext.BaseDirectory获取exe所在的绝对根目录,不要用Directory.GetCurrentDirectory()获取路径,该方法拿到的是服务进程当前工作目录,也就是错误的System32路径。
  • 手动拼接日志文件的绝对路径后再传入Serilog的文件写入配置,参考代码如下:
// 先构建配置对象
var configuration = new ConfigurationBuilder()
    .SetBasePath(AppContext.BaseDirectory)
    .AddJsonFile("appsettings.json")
    .Build();

// 拼接日志绝对路径
var relativeLogPath = configuration.GetValue<string>("Logging:File:PathFormat");
var fullLogPath = Path.Combine(AppContext.BaseDirectory, relativeLogPath);

// 配置Serilog
Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .WriteTo.File(
        path: fullLogPath,
        fileSizeLimitBytes: configuration.GetValue<long>("Logging:File:fileSizeLimitBytes"),
        retainedFileCountLimit: configuration.GetValue<int>("Logging:File:retainedFileCountLimit")
    )
    .CreateLogger();
  • 临时验证可以先打开C:\Windows\System32目录,搜索log-*.txt格式的文件,如果能找到对应日期的日志文件,就可以100%确认是路径解析问题,按上述代码修改后重新部署服务即可正常写入日志。
  • 额外注意:Windows服务不会自动将工作目录切换为exe所在路径,无论用什么方式注册服务、配置什么运行账号,都必须在代码里显式处理日志等文件操作的绝对路径,不要依赖相对路径。

内容的提问来源于stack exchange,提问作者Sasan.R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:16:31