Serilog:使用简单的 for 循环记录时缺少日志

Serilog: Missing logs when logging with simple for loop

我已经开始使用 Serilog 并编写了测试 Dot Net Core 3.1 控制台应用程序

在我的简单项目中,我正在循环和记录。 Serilog 登录 ConsoleFile.

但我发现在 10,000 个日志条目后日志会丢失。直到 10,000 个日志条目,所有日志在控制台和文件中都是序列,但在 10,000 个条目之后,ConsoleFile 上的日志开始丢失。比如10000后29483.

此外,用于刷新所有日志的函数调用 Log.CloseAndFlush() 无法正常工作,因为我在 Console[=47] 的末尾没有看到日志条目 "FINISHED" =]和文件.

2020-05-26 12:12:38.575 | [INFO] | Thread-1 | hello:1
........ Logs are in sequencial order ........
2020-05-26 12:12:38.575 | [INFO] | Thread-1 | hello:9993
2020-05-26 12:12:38.575 | [INFO] | Thread-1 | hello:9994
2020-05-26 12:12:38.575 | [INFO] | Thread-1 | hello:9995
2020-05-26 12:12:38.575 | [INFO] | Thread-1 | hello:9996
2020-05-26 12:12:38.575 | [INFO] | Thread-1 | hello:9997
2020-05-26 12:12:38.575 | [INFO] | Thread-1 | hello:9998
2020-05-26 12:12:38.575 | [INFO] | Thread-1 | hello:9999
2020-05-26 12:12:38.575 | [INFO] | Thread-1 | hello:10000
2020-05-26 12:12:38.637 | [INFO] | Thread-1 | hello:29483
2020-05-26 12:12:38.689 | [INFO] | Thread-1 | hello:62627
2020-05-26 12:12:38.693 | [INFO] | Thread-1 | hello:64740
2020-05-26 12:12:38.694 | [INFO] | Thread-1 | hello:65624
2020-05-26 12:12:38.695 | [INFO] | Thread-1 | hello:66169
2020-05-26 12:12:38.697 | [INFO] | Thread-1 | hello:66662
2020-05-26 12:12:38.697 | [INFO] | Thread-1 | hello:67040
2020-05-26 12:12:38.698 | [INFO] | Thread-1 | hello:67432
2020-05-26 12:12:38.698 | [INFO] | Thread-1 | hello:67828
2020-05-26 12:12:38.699 | [INFO] | Thread-1 | hello:68083
2020-05-26 12:12:38.700 | [INFO] | Thread-1 | hello:68386
2020-05-26 12:12:38.700 | [INFO] | Thread-1 | hello:68756
2020-05-26 12:12:38.701 | [INFO] | Thread-1 | hello:69387
2020-05-26 12:12:38.702 | [INFO] | Thread-1 | hello:69904
2020-05-26 12:12:38.703 | [INFO] | Thread-1 | hello:70296
2020-05-26 12:12:38.703 | [INFO] | Thread-1 | hello:70681
2020-05-26 12:12:38.704 | [INFO] | Thread-1 | hello:71093
2020-05-26 12:12:38.706 | [INFO] | Thread-1 | hello:72488
2020-05-26 12:12:38.706 | [INFO] | Thread-1 | hello:72945
2020-05-26 12:12:38.707 | [INFO] | Thread-1 | hello:73590
2020-05-26 12:12:38.708 | [INFO] | Thread-1 | hello:73975
2020-05-26 12:12:38.708 | [INFO] | Thread-1 | hello:74383
2020-05-26 12:12:38.709 | [INFO] | Thread-1 | hello:74783
2020-05-26 12:12:38.709 | [INFO] | Thread-1 | hello:75183
2020-05-26 12:12:38.711 | [INFO] | Thread-1 | hello:75644
2020-05-26 12:12:38.712 | [INFO] | Thread-1 | hello:76087
2020-05-26 12:12:38.713 | [INFO] | Thread-1 | hello:76719

我正在查看其他开发人员因丢失日志而面临的问题,但其中 none 与我的问题有关。

Program.cs

using Microsoft.Extensions.Configuration;
using Serilog;
using Serilog.Core;
using System;

namespace MyApp
{
    public class Program
    {
        static void Main(string[] args)
        {
            var l_config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();

            Logger l_log = new LoggerConfiguration().ReadFrom.Configuration(l_config).CreateLogger();
            Log.Logger = l_log;

            for (long l_index = 0; l_index < 100000L; l_index++)
            {
                Log.Information("hello:" + l_index);
            }
            Log.Information("FINISHED");
            Log.CloseAndFlush();
            Console.ReadKey();
        }

        ~Program()
        {
            Log.CloseAndFlush();
        }
    }
}

appsettings.json

{
    "Serilog": {
        "Using": ["Serilog.Sinks.Console"],
        "MinimumLevel": "Debug",
        "WriteTo": [{
                "Name": "Async",
                "Args": {
                    "configure": [{
                            "Name": "Console",
                            "Args": {
                                "MinimumLevel": "Verbose",
                                "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} | [{Level:u4}] | Thread-{ThreadId} | {Message:lj}{NewLine}{Exception}"
                            }                           
                        }, {
                            "Name": "File",
                            "Args": {
                                "MinimumLevel": "Verbose",
                                "path": "Logs\log..txt",                               
                                "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} | [{Level:u4}] | Thread-{ThreadId} | {Message:lj}{NewLine}{Exception}",
                                "rollingInterval": "Hour",
                            }
                        }
                    ]
                }
            }
        ],
        "Enrich": ["FromLogContext", "WithThreadId"],
        "Destructure": [{
                "Name": "ToMaximumDepth",
                "Args": {
                    "maximumDestructuringDepth": 4
                }
            }, {
                "Name": "ToMaximumStringLength",
                "Args": {
                    "maximumStringLength": 100
                }
            }, {
                "Name": "ToMaximumCollectionCount",
                "Args": {
                    "maximumCollectionCount": 10
                }
            }
        ],
        "Properties": {
            "Application": "MyApp"
        }
    }
}

使用 Nuget 包:

  • Serilog.dll
  • Serilog.Enrichers.Environment.dll
  • Serilog.Enrichers.Thread.dll
  • Serilog.Settings.Configuration.dll
  • Serilog.Sinks.Async.dll
  • Serilog.Sinks.Console.dll

很抱歉在这里提供了很多信息,但这是必需的,这样我们才能查明问题所在。

这是因为缓冲区大小 feeding Async() 默认固定为 10,000 项,满时不会阻塞。

要更改此设置,请添加 blockWhenFull: true:

    "WriteTo": [{
            "Name": "Async",
            "Args": {
                "blockWhenFull": true,
                "configure": [{

更多信息here and here