【发布时间】:2021-04-28 12:21:04
【问题描述】:
我正在使用 dotnet worker 服务 (.net 5) 我集成了 serilog 以及丰富器和接收器。 但由于某种原因,我在文件日志中看不到任何输出。
这是我的 appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=eeee;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"WorkerOptions": {
"Batch": 5
},
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": {
"path": "E:\\Logs\\log_.txt",
"outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
},
{
"Name": "File",
"Args": {
"path": "E:\\Logs\\log_.json",
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
"outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
}
]
}
}
记录器的注册:
public class Program
{
public static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
services.AddScoped<ApplicationDbContext>(s => new ApplicationDbContext(optionsBuilder.Options));
services.AddHostedService<Worker>();
});
}
这是一个实现:
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly IConfiguration _config;
public Worker(ILogger<Worker> logger, IServiceScopeFactory serviceScopeFactory, IConfiguration config)
{
_config = config;
_logger = logger;
_serviceScopeFactory = serviceScopeFactory;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Worker picked up {0} requests for dispatch at at: {time}", generatedRequests.Count(), DateTimeOffset.Now);
}
当我通过 Kestrel 运行工作程序时,我可以在控制台日志中看到,但在 .txt 文件或 .json 文件中看不到
更新 #1 我在下面尝试了这个答案,但是当我部署我的工作人员时仍然遇到问题,我没有看到任何日志。 当我通过 service.exe 文件运行它或只是进行调试(Kestrel)时,会生成日志文件。
这里是更新的application.json:
"Serilog": {
"Using": [],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": {
"path": ".\\Logs\\log_.txt",
"outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
},
{
"Name": "File",
"Args": {
"path": ".\\Logs\\log_.json",
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
"outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
}
]
}
这是 Program.cs
public class Program
{
public static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseSqlServer(hostContext.Configuration.GetConnectionString("DefaultConnection"));
services.AddScoped<ApplicationDbContext>(s => new ApplicationDbContext(optionsBuilder.Options));
services.AddHostedService<Worker>();
})
.UseSerilog(); // no args
}
更新#2 我像这样更新了 Program 类:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseSqlServer(hostContext.Configuration.GetConnectionString("DefaultConnection"));
services.AddScoped<ApplicationDbContext>(s => new ApplicationDbContext(optionsBuilder.Options));
services.AddHostedService<Worker>();
})
.UseSerilog((hostContext, services, logger) => {
logger.ReadFrom.Configuration(hostContext.Configuration);
});
}
}
我还在 appsettings.json 中放了一些简单的东西:
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": { "path": "Logs/log.txt" }
},
//{
// "Name": "File",
// "Args": {
// "path": ".\\Logs\\log_.txt",
// "outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
// "rollingInterval": "Day",
// "retainedFileCountLimit": 7
// }
//},
{
"Name": "File",
"Args": {
"path": ".\\Logs\\log_.json",
"formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
"outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
}
]
}
当我启动 .exe 文件(控制台)时,这也是正在工作的 _logger 的调用
using Microsoft.Extensions.Logging;
...
private readonly ILogger<Worker> _logger;
...
_logger.LogInformation("Worker picked up {0} requests for dispatch at: {time}", generatedRequests.Count(), DateTimeOffset.Now);
更新#3
我只是设置了记录c:\\Logs\log.txt 的绝对路径,它部分工作 - 它创建一个 txt 文件,但文件为空。
这是新的 appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=svcProcessor_dev;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"WorkerOptions": {
"Batch": 10,
"Delay": 5000,
"MaxAttempts": 3
},
"Serilog": {
"Using": ["Serilog.Sinks.Console", "Serilog.Sinks.File"],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
"WriteTo": [
{ "Name": "Console" },
{
"Name": "File",
"Args": { "path": "C:\\Logs\\log.txt" }
}
//{
// "Name": "File",
// "Args": {
// "path": "C:\\Logs\\log_.txt",
// "outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
// "rollingInterval": "Day",
// "retainedFileCountLimit": 7
// }
//}
//{
// "Name": "File",
// "Args": {
// "path": "C:\\Logs\\log_.json",
// "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
// "outputTemplate": "{Timestamp:o} {Message}{NewLine:1}{Exception:1}",
// "rollingInterval": "Day",
// "retainedFileCountLimit": 7
// }
//}
]
}
}
更新#4
这是我的工人的最小示例 worker example
【问题讨论】:
-
可能是个愚蠢的问题,但是您检查过文件夹权限吗?执行进程需要对
E:\logs的写访问 -
是的,我检查了。另外,我尝试更改为应用程序的根文件夹
.\\Logs\log_.txt -
尝试使用异步写入器。我知道这听起来很荒谬,但在某些情况下,在同一线程中调用 logger 不适用于日志适配器 (UseSerilog)。
-
你如何在 linux 机器上部署你的应用程序?码头工人或其他一些方法?
标签: c# asp.net-core asp.net-core-webapi backgroundworker serilog