繁体   English   中英

.Net Core 6 Worker Service 在作为 Windows 服务运行时不写入日志

[英].Net Core 6 Worker Service not writing to Logs when running as a Windows Service

我使用 C# / .Net Core 6 (Visual Studio 2022) 创建了一个 Worker 服务。

如果通过 Visual Studio 运行或直接从 Windows 资源管理器/PowerShell 启动,它将按预期写入日志文件。 但是,当作为 Windows 服务安装时,它不会创建或写入日志文件。

这是我的程序.cs:

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
    .MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Information)
    .Enrich.FromLogContext()
    .WriteTo.File("./logs/log-.txt", rollingInterval:RollingInterval.Day)
    .CreateBootstrapLogger();

try
{
    Log.Information("Starting the Service");

    IHost host = Host.CreateDefaultBuilder(args)
        .UseWindowsService()
        .ConfigureAppConfiguration((hostContext, configBuilder) =>
        {
            configBuilder
                //.SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{Environment.MachineName}.json", true, true)
                .Build();
        })
        .UseSerilog((context, services, configuration) => configuration
            .ReadFrom.Configuration(context.Configuration)
            .ReadFrom.Services(services)
            .Enrich.FromLogContext())
        .ConfigureServices((hostContext, services) =>
        {
            ... 
        })
        .Build();

    
    await host.RunAsync();
}
catch (Exception ex)
{
    Log.Fatal(ex, "There was a problem starting the service");
}
finally
{
    Log.Information("Service successfully stopped");

    Log.CloseAndFlush();
}

我在 appsettings.json 中有这个:

  "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Sinks.Debug" ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "File",
        "Args": {
          "path": ".\\logs\\log-.txt",
          "rollingInterval": "Day"
        }
      }
    ],
    "Enrich": [ "FromLogContext" ]
  }

如果我包含“SetBasePath”部分,服务将无法启动(尽管它仍然通过 Visual Studio 运行)。

我从 Visual Studio 发布服务,目标框架 = net6.0,部署模式 = 框架依赖,目标运行时 = win-x64。

注意:我在 Program.cs 中创建了一个 Logger,因为我想记录服务的启动和停止/崩溃。

正如其他人所指出的,服务使用与进程位置不同的工作目录运行。 我喜欢使用的一个老技巧是首先将工作目录设置为进程的二进制目录:

Environment.CurrentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

就我而言,我只是将Deployment mode更改为Self-Contained并选择Produce single file 虽然它会创建一个大文件,但现在编译器将所有依赖库嵌入到一个文件中。

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM