.NET 6 Worker Service绝对路径配置Serilog日志失效问题求助
.NET 6独立单文件发布后Serilog日志失效问题解决
问题
已有开发者反馈.NET 6中Serilog写入日志文件存在异常,本人在使用绝对路径配置时也遇到类似情况:在Rider IDE中运行代码时日志正常输出,但发布为独立可执行文件后日志失效。相关代码、配置及发布设置如下:
启动代码
using System.Reflection; using Serilog; using WorkerService1; IHost host = Host.CreateDefaultBuilder(args) .ConfigureServices(services => { services.AddHostedService<Worker>(); }) .UseSerilog((context, _, config) => { config.ReadFrom.Configuration(context.Configuration) .Enrich.FromLogContext(); if (args.Contains("--console")) { config.WriteTo.Console(); } }) .UseWindowsService() .Build(); await host.RunAsync();
Worker类代码
namespace WorkerService1; public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); await Task.Delay(1000, stoppingToken); } } }
appsettings配置
{ "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Warning", "System": "Warning" } }, "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ], "WriteTo": [ { "Name": "File", "Args": { "restrictedToMinimumLevel": "Information", "path": "C:\\temp\\logs\\JustLog.log", "rollingInterval": "Day", "rollOnFileSizeLimit": true, "fileSizeLimitBytes": 10487600, "retainedFileCountLimit": 30 } } ] } }
csproj文件
<Project Sdk="Microsoft.NET.Sdk.Worker"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <OutputType>exe</OutputType> <PublishSingleFile Condition="'$Configuration' == 'Release'">true</PublishSingleFile> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <PlatformTarget>x64</PlatformTarget> <PublishTrimmed>false</PublishTrimmed> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> <PackageReference Include="Serilog.Extensions.Hosting" Version="4.2.0" /> <PackageReference Include="Serilog.Settings.Configuration" Version="3.3.0" /> <PackageReference Include="Serilog.Sinks.Console" Version="4.0.1" /> <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" /> </ItemGroup> </Project>
发布设置
发布为独立单文件,目标平台为win-x64,未启用代码裁剪。
解决方案
针对独立单文件发布后Serilog文件日志失效的问题,可通过以下方式逐一排查解决:
确保日志目录存在:独立程序运行时不会自动创建不存在的目录,需手动创建
C:\temp\logs,或在启动代码中添加目录检查逻辑:var logDir = Path.GetDirectoryName("C:\\temp\\logs\\JustLog.log"); if (!Directory.Exists(logDir)) { Directory.CreateDirectory(logDir); }升级Serilog.Sinks.File包版本:5.0.0版本在单文件发布场景下存在已知兼容性问题,升级到5.0.1及以上版本可修复。修改csproj中的包引用:
<PackageReference Include="Serilog.Sinks.File" Version="5.0.1" />调整单文件发布配置:在csproj的PropertyGroup中添加以下配置,避免文件系统访问异常:
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>检查运行权限:若程序以Windows服务运行,需确保服务账户拥有
C:\temp\logs目录的读写权限。可将服务账户设置为LocalSystem,或手动给目标目录添加对应账户的权限。
内容的提问来源于stack exchange,提问作者Daan
相关产品推荐
相关产品推荐

