C# 设置日志批处理的增长量限制

C# 设置日志批处理的增长量限制,c#,nlog,C#,Nlog,我正在使用NLog在大型生产环境中处理日志消息。以下函数创建NLog配置对象。我真的需要记录所有日志消息,所以我不能删除日志消息。因此,我将asynctargetrapper的OverflowAction设置为Grow。然而,问题是Azure表存储限制为每批1000条记录。如果我尝试批量保存1001条消息,则不会保存任何内容。我找不到如何将NLog配置为将增长限制在1000,并在达到此值后进行刷新。除此之外,定期刷新一直在进行,但由于我们的应用程序执行大量日志记录,因此增长的批很可能会超过Azu

我正在使用NLog在大型生产环境中处理日志消息。以下函数创建NLog配置对象。我真的需要记录所有日志消息,所以我不能删除日志消息。因此,我将
asynctargetrapper
OverflowAction
设置为
Grow
。然而,问题是Azure表存储限制为每批1000条记录。如果我尝试批量保存1001条消息,则不会保存任何内容。我找不到如何将NLog配置为将增长限制在1000,并在达到此值后进行刷新。除此之外,定期刷新一直在进行,但由于我们的应用程序执行大量日志记录,因此增长的批很可能会超过Azure表存储的1000个日志限制

考虑到Azure表存储的1000条记录限制,如何配置NLog以安全地将所有日志保存到表存储

public static LoggingConfiguration SetupLoggingConfiguration(
    string instrumentationKey,
    string tableStorageConnectionString,
    LogLevel appInsightsLogLevel,
    LogLevel tableStorageLogLevel)
{
    var config = new LoggingConfiguration();

    // Targets
    var applicationInsightsTarget = new ApplicationInsightsTarget()
    {
        Name = nameof(ApplicationInsightsTarget),
        InstrumentationKey = instrumentationKey,
        Layout = "${longdate}|${level:uppercase=true}|${logger}|${message}"
    };

    var tableStorageTarget = new TableStorageTarget()
    {
        Name = nameof(TableStorageTarget),
        Layout = "${callsite:cleanNamesOfAnonymousDelegates=true}:${callsite-linenumber}${newline}Stack Trace:${stacktrace}",
        ConnectionString = tableStorageConnectionString,
        OptimizeBufferReuse = true,
        TableName = "Logs"
    };

    var tableStorageWrapper = new AsyncTargetWrapper()
    {
        WrappedTarget = tableStorageTarget,
        QueueLimit = 500,
        OverflowAction = AsyncTargetWrapperOverflowAction.Grow
    };

    // Rules
    config.AddRule(appInsightsLogLevel, LogLevel.Fatal, applicationInsightsTarget);
    config.AddRule(tableStorageLogLevel, LogLevel.Fatal, tableStorageWrapper);

    return config;
}

如果您的TableStorage目标来自,那么它不可能一次保存100条以上的记录。所以你1001条记录的问题肯定是别的

AsyncTargetTrapper
有一个名为
BatchSize
的参数,该参数控制它向目标发送多少日志事件。默认值是NLog版本中的200个logevents。4.5.8


但是,如果在NLog中执行显式刷新,则它将触发
AsyncTargetTrapper
,以独立于
BatchSize
刷新其所有挂起的日志事件。我想这可以通过请求NLog项目来改变。但是应该避免调用NLog Flush,只在特殊情况下(例如关机)调用它。

事实上,我确实使用了jdetmar中提到的包。谢谢你的回答,我会检查一下,一旦发现问题,我会回复并添加投票。