当 运行 作为服务时,Serilog 文件日志记录不是从 Worker Service 写入的
Serilog file logging not written from Worker Service when running as service
我正在编写一个需要使用 Serilog 并写入日志文件的辅助服务。 (.net 核心 6 和 Windows 服务)。相同的服务,当使用 Microsoft.Extensions.Logging 并按照 aspsettings.json 中的配置写入事件日志时,记录到事件日志中就好了。另外,我已经证明我可以访问正在写入日志的目录。
当我将项目配置为使用 Serilog 写入日志文件时,日志文件永远不会写入(如果不存在,则不会创建)。我希望您能就未创建日志文件的原因提供任何意见。
Nuget 包
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="5.0.0" />
<PackageReference Include="Serilog.Enrichers.Environment" Version="2.2.0" />
Program.cs
using Serilog;
using WorkerServiceAndSerilog;
IHost host = Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureAppConfiguration((builderContext, config) =>
{
config.SetBasePath(System.AppDomain.CurrentDomain.BaseDirectory);
})
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
services.AddLogging(configure => configure.AddSerilog());
})
.UseSerilog((hostingContext, loggerConfiguration) =>
loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration))
.Build();
var logger = host.Services.GetService<ILogger<Program>>();
logger!.LogInformation($"Before host.RunAsync");
using (System.IO.StreamWriter file = new System.IO.StreamWriter(path: @"c:\POC\logs\accessProof.txt", true))
file.WriteLine($"We're Running WorkerServiceAndSerilog {DateTime.Now}");
await host.RunAsync();
我的应用程序设置配置为写入控制台和文件,文件使用 Json 格式化程序。正在加载应用程序设置。在添加 Serilog 之前,我正在加载配置成功的事件日志记录的应用程序设置。 SetBasePath 是实现该功能的关键。
来自 appsettings.json
的片段
"Serilog": {
"Enable": true,
"MinimumLevel": {
"Default": "Verbose",
"Override": {
"System": "Error",
"Microsoft": "Verbose",
"Microsoft.AspNetCore": "Verbose",
"Microsoft.EntityFrameworkCore": "Information"
}
},
"WriteTo": [
{
"Name": "Logger",
"Args": {
"configureLogger": {
"WriteTo": [
{
"Name": "Console",
"Args": {
"restrictedToMinimumLevel": "Debug",
"outputTemplate": "{Timestamp:MM-dd HH:mm:ss.ffff} | {Level:u3} | {MachineName} | {RequestId} | {Assembly} | {Version} | {Message:lj}{NewLine}{Exception}"
}
},
{
"Name": "File",
"Args": {
"restrictedToMinimumLevel": "Information",
"path": "\POC\logs\WS.log",
"rollingInterval": "Day",
"retainedFileCountLimit": 7,
"buffered": true,
"flushToDiskInterval": "00:00:02",
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"
}
}
mason给的self log建议指出了Serilog无法加载的地方。我能够使用该信息找到解决方案。
在 .Net Core 5 和 6 中,有一个用于生成单个文件的发布选项。我正在使用该选项。如此发布时,Serilog 不支持 auto-discovery 个配置程序集 (documentation)。因此无法加载 Sinks、Enrichers 等。
我的解决方案是在 appsettings.json.
中添加一个 using 语句
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Enrichers.Environment", "Serilog.Enrichers.Thread", "Serilog.Exceptions", "Serilog.Expressions" ],
"Enable": true,
"MinimumLevel": {
...
我正在编写一个需要使用 Serilog 并写入日志文件的辅助服务。 (.net 核心 6 和 Windows 服务)。相同的服务,当使用 Microsoft.Extensions.Logging 并按照 aspsettings.json 中的配置写入事件日志时,记录到事件日志中就好了。另外,我已经证明我可以访问正在写入日志的目录。
当我将项目配置为使用 Serilog 写入日志文件时,日志文件永远不会写入(如果不存在,则不会创建)。我希望您能就未创建日志文件的原因提供任何意见。
Nuget 包
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="5.0.0" />
<PackageReference Include="Serilog.Enrichers.Environment" Version="2.2.0" />
Program.cs
using Serilog;
using WorkerServiceAndSerilog;
IHost host = Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureAppConfiguration((builderContext, config) =>
{
config.SetBasePath(System.AppDomain.CurrentDomain.BaseDirectory);
})
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
services.AddLogging(configure => configure.AddSerilog());
})
.UseSerilog((hostingContext, loggerConfiguration) =>
loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration))
.Build();
var logger = host.Services.GetService<ILogger<Program>>();
logger!.LogInformation($"Before host.RunAsync");
using (System.IO.StreamWriter file = new System.IO.StreamWriter(path: @"c:\POC\logs\accessProof.txt", true))
file.WriteLine($"We're Running WorkerServiceAndSerilog {DateTime.Now}");
await host.RunAsync();
我的应用程序设置配置为写入控制台和文件,文件使用 Json 格式化程序。正在加载应用程序设置。在添加 Serilog 之前,我正在加载配置成功的事件日志记录的应用程序设置。 SetBasePath 是实现该功能的关键。
来自 appsettings.json
的片段 "Serilog": {
"Enable": true,
"MinimumLevel": {
"Default": "Verbose",
"Override": {
"System": "Error",
"Microsoft": "Verbose",
"Microsoft.AspNetCore": "Verbose",
"Microsoft.EntityFrameworkCore": "Information"
}
},
"WriteTo": [
{
"Name": "Logger",
"Args": {
"configureLogger": {
"WriteTo": [
{
"Name": "Console",
"Args": {
"restrictedToMinimumLevel": "Debug",
"outputTemplate": "{Timestamp:MM-dd HH:mm:ss.ffff} | {Level:u3} | {MachineName} | {RequestId} | {Assembly} | {Version} | {Message:lj}{NewLine}{Exception}"
}
},
{
"Name": "File",
"Args": {
"restrictedToMinimumLevel": "Information",
"path": "\POC\logs\WS.log",
"rollingInterval": "Day",
"retainedFileCountLimit": 7,
"buffered": true,
"flushToDiskInterval": "00:00:02",
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"
}
}
mason给的self log建议指出了Serilog无法加载的地方。我能够使用该信息找到解决方案。
在 .Net Core 5 和 6 中,有一个用于生成单个文件的发布选项。我正在使用该选项。如此发布时,Serilog 不支持 auto-discovery 个配置程序集 (documentation)。因此无法加载 Sinks、Enrichers 等。
我的解决方案是在 appsettings.json.
中添加一个 using 语句 "Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Enrichers.Environment", "Serilog.Enrichers.Thread", "Serilog.Exceptions", "Serilog.Expressions" ],
"Enable": true,
"MinimumLevel": {
...