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();
}
}
下面用于 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();
}
}