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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:40:25