c# - Serilog WriteTo.File() 在控制台应用程序中有效,但在 .net Core 3 Worker Service 中无效

标签 c# logging .net-core serilog

下面的 LoggerConfiguration() 初始化代码适用于 .net core 3 控制台应用程序的 Main(),但不适用于辅助服务。使用控制台应用程序,“logs”文件夹和 log.txt 是在运行时创建的。运行服务时未创建该文件夹,因此我尝试了多个文件路径(“c:\log.txt”、“..\log.txt”、“..\..\log.txt”),但没有一个被创造。调试控制台中显示日志记录,但未创建 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" />

程序.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/

关于c# - Serilog WriteTo.File() 在控制台应用程序中有效,但在 .net Core 3 Worker Service 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59397633/

相关文章:

java - 查找触发日志的位置

c# - 为什么这个特定的 PowerShell 命令在 .NET 6 中失败(它曾经在 .NET 4 中工作)

c# - 尝试在 .Net Core 控制台应用程序中使用 System.Drawing 时出错

c# - int[,] 的数独求解器算法

c# - ASP.NET C# MySql 选择和更新表单

logging - 在上游作业中显示下游作业的控制台输出

c++ - 每个类(class)都有不同的 boost 日志接收器

docker - ASP .NET Core 在 Heroku 上给出 System.Net.Sockets.SocketException 错误

c# - 错误: Inserting a BLOB in MySQL results in null using C#

c# - Silverlight 的 TaskCompletionSource<T>?