logging - Serilog:使用简单的 for 循环记录时丢失日志

标签 logging .net-core serilog

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

在我的简单项目中,我正在循环和记录日志。 Serilog 记录在控制台文件上。

但我发现日志条目超过 10,000 条后就会丢失。在 10,000 个日志条目之前,所有日志都是控制台和文件中的序列,但在 10,000 个条目之后,控制台和文件中的日志开始丢失。例如,10000 后的 29483。

此外,函数调用 Log.CloseAndFlush() 来刷新所有日志不起作用,因为我在控制台文件末尾没有看到日志条目“FINISHED” em>.

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

我正在查看其他开发人员在丢失日志时遇到的问题,但它们都与我的问题无关。

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

很抱歉在这里提供了大量信息,但这是我们需要的,以便我们可以查明问题。

最佳答案

这是因为Async()的缓冲区大小默认固定为10,000个项目,并且在满时不会阻塞。

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

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

更多信息herehere .

关于logging - Serilog:使用简单的 for 循环记录时丢失日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62016368/

相关文章:

python + Nose : make assertions about logged text?

logging - 如何将节点红色控制台日志保存到Docker中的单独日志文件中

c# - Serilog - ForContext 将字典值视为复杂对象

serilog - serilog.settings.appsettings 和文件滚动间隔的问题

c# - 是否可以在 C#/.Net 中将消息记录到 cmd.exe?

logging - 我可以在 Docker swarm 上使用 logspout 进行全局 syslog 日志记录吗?

.net - 从 Controller Asp.Net Core SignalR 发送消息

c# - Visual Studio 2019 未将引用的项目添加到 deps.json

c# - 如何从 .net 核心客户端生成 JWT Bearer Flow OAuth 访问 token ?

serilog - 如何添加不属于消息模板的命名属性?