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

