Serilog WriteTo.File() 在 Console App 中有效,但在 .net Core 3 Worker Service 中无效

Serilog WriteTo.File() works in Console App but not in .net Core 3 Worker Service

下面用于 LoggerConfiguration() 初始化的代码在 .net core 3 控制台应用程序的 Main() 中工作,但在辅助服务中不工作。使用控制台应用程序,'logs' 文件夹和 log.txt 是在 运行 时创建的。 运行服务时没有创建文件夹,所以我尝试了多个文件路径("c:\log.txt",“..\log.txt”,“..\..\log.txt") none 其中已创建。日志显示在调试控制台中,但未创建 log.txt 文件。没有抛出错误,VS 2019 运行宁作为管理员。

引用的包:

<PackageReference Include="Serilog" Version="2.9.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />

Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;

namespace WorkerService1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .WriteTo.Console()
                .WriteTo.File("logs\log.txt", rollingInterval: RollingInterval.Day)
                .CreateLogger();

            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                });
    }
}

Worker.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

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);
            }
        }
    }
}

我成了同一个名字古怪的 NuGet 包的受害者。您需要添加 Serilog.AspNetCore,即使它是一个控制台应用程序。有关详细信息,请参阅本文:https://www.blinkingcaret.com/2018/02/14/net-core-console-logging/

@christopher-rosales 的评论引用了 .UseSerilog()。这需要一个额外的包,Serilog.Extensions.Hosting。 Main()中Log.Logger的init没有起作用,所以我把它添加到CreateHostBuilder()中。

Program.cs:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;

namespace WorkerService1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .WriteTo.Console()
                .WriteTo.File("logs\log.txt", rollingInterval: RollingInterval.Day)
                .CreateLogger();

            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                })
                .UseSerilog();
    }
}