c# - serilog 异步接收器在关闭时未将缓冲区刷新到磁盘
问题描述
将 serilog 异步接收器与文件接收器(并且 buffered = true)一起使用时,日志条目在关闭时会丢失。我猜这是缓冲区没有刷新到磁盘,即使它正在被调用。我不确定为什么会发生这种情况,但我很确定这是异步接收器。如果我将它从配置中删除并单独使用文件接收器,则日志会按预期刷新到磁盘。
我有一个相当简单的设置。
程序.cs:
public class Program
{
public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
.AddEnvironmentVariables()
.Build();
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.CreateLogger();
try
{
Log.Information("Starting the web host");
CreateWebHostBuilder(args).Build().Run();
Log.Information("Shutting down the web host");
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
Log.Information("Closing Log");
Log.CloseAndFlush();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog();
}
应用设置.json
{
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
}
},
...
appsettings.Development.json
{
"Serilog": {
"WriteTo": [
{
"Name": "Async",
"Args": {
"configure": [
{
"Name": "Console",
"Args": {
"theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
}
},
{
"Name": "File",
"Args": {
"path": "logs/log.txt",
"formatter": "Serilog.Formatting.Json.JsonFormatter",
"rollingInterval": "Day",
"retainedFileCountLimit": 7,
"buffered": true
}
}
]
}
}
]
}
}
如果我在 Log.CloseAndFlush() 行上放置一个断点,它会在关闭时触发它,但它实际上并没有将缓冲区刷新到磁盘。
有任何想法吗?
解决方案
您必须以以下格式组织您的配置。
"WriteTo": [
{
"Name": "Async",
"Args": {
"configure": [
{
"Name": "Console",
"Args": {
"theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
}
}
]
}
},
{
"Name": "Async",
"Args": {
"configure": [
{
"Name": "File",
"Args": {
"path": "logs/log.txt",
"formatter": "Serilog.Formatting.Json.JsonFormatter",
"rollingInterval": "Day",
"retainedFileCountLimit": 7,
"buffered": true
}
}
]
}
}
]
推荐阅读
- java - 列表到 txt 文件变得非常大,我的意思是巨大的
- javascript - Vue/Vuex - 如何从孙辈那里检索数据
- android - 按钮单击后在 recyclerview 中为单个视图设置动画
- python-3.x - 使用 urllib 下载文件并指定保存位置
- php - 单域PHP版本变更| 浏览器下载
- android - 在不同模块中具有相同布局的 Android 数据绑定
- python - 在 Python 中使用套接字发送帧
- r - 使用 top_n 后,R 在管道期间丢失排序
- go - K8s 更改配置映射并更新应用日志级别
- mysql - 在 MySQL 8.0+ 中使用 MySQL 驱动程序在 MySQL 语句中传递 C++ 变量