我正在使用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;
}
答案 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,而只能在特殊情况下(例如关机)调用它。