设置日志批数可以增长的限制

时间:2018-08-16 09:45:16

标签: c# nlog

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

考虑到Azure TableStorage的1,000条记录限制,如何配置NLog以安全地将所有日志保存到TableStorage?

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;
}

1 个答案:

答案 0 :(得分:0)

如果您的TableStorageTarget来自https://www.nuget.org/packages/NLog.Extensions.AzureStorage/,则不可能一次保存100条以上的记录。因此,与1001条记录有关的问题一定是其他问题。

AsyncTargetWrapper有一个名为BatchSize的参数,该参数控制它发布到目标目标的日志事件数。 NLog ver中的默认值为200 logevent。 4.5.8

但是,如果您在NLog中执行显式刷新,则它将触发AsyncTargetWrapper来独立于BatchSize刷新其所有未决日志事件。我猜这可以通过为NLog项目创建一个PullRequest来更改。但是应该避免调用NLog Flush,而只能在特殊情况下(例如关机)调用它。