.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
相关产品推荐
相关产品推荐

