Проблема с NLOG WhenRepeatedFilter и несколькими целями - PullRequest
1 голос
/ 08 июня 2019

Я добавляю Страж к одной из моих целей в NLOG (4.6.4). Поскольку у нас иногда возникает многократный триггер ошибок, я создавал WhenRepeatedFilter, чтобы остановить повторяющиеся ошибки и регистрировать только 1 из них со счетчиком. Этот фильтр уже работает с моим mailtarget.

Когда я добавляю этот фильтр, также моя цель Sentry. Цель почты все еще работает, но цель Sentry перестает работать. Я добавляю неправильный путь?

Когда я пытаюсь изменить порядок целей, моя почтовая цель перестает работать, а Sentry работает.

LoggingConfiguration config = new LoggingConfiguration();

var WhenFilter = new WhenRepeatedFilter();
WhenFilter.Layout = "${message}";
WhenFilter.TimeoutSeconds = 600;
WhenFilter.Action = FilterResult.Ignore;
WhenFilter.IncludeFirst = false;
WhenFilter.FilterCountPropertyName = "filteredCount";
WhenFilter.FilterCountMessageAppendFormat = "\n\nIgnored: {0}";

//File log instellen
FileTarget fileTarget = new FileTarget();

fileTarget.FileName = Path.Combine(LogPath, "automate.log");
fileTarget.ArchiveFileName = Path.Combine(LogPath, "automate.{#####}.log");
fileTarget.ArchiveAboveSize = 512000; // 500kb
fileTarget.ArchiveNumbering = ArchiveNumberingMode.Sequence;
fileTarget.MaxArchiveFiles = 10;
fileTarget.ConcurrentWrites = true;
fileTarget.KeepFileOpen = false;

fileTarget.Layout = "${longdate} | ${level} | ${callsite} | ${event-properties:item=DebId} | ${event-properties:item=Gebruiker} | ${message}";


var BufferTarget = new BufferingTargetWrapper()
{
    BufferSize = 100,
    SlidingTimeout = false,
    FlushTimeout = 5000,
    Name = "BufferTarget",
    OverflowAction = BufferingTargetWrapperOverflowAction.Flush,
    WrappedTarget = fileTarget
};
config.AddTarget("file", BufferTarget);

LoggingRule ruleFile = new LoggingRule("*", LogLevel.Error, BufferTarget);
config.LoggingRules.Add(ruleFile);

//Mail log instellen

MailTarget mailTarget = new MailTarget();
config.AddTarget("mail", mailTarget);

mailTarget.Name = "mail";
[....]
mailTarget.AddNewLines = true;
mailTarget.Layout = "${longdate} | ${windows-identity} | ${event-properties:item=Versie} | ${level} | ${callsite} ${newline} ${event-properties:item=DebId} | ${event-properties:item=Bedrijf} | ${event-properties:item=Gebruiker} | Dubbele overgeslagen:${event-context:item=filteredCount}}${newline}${event-properties:item=Ips}${newline} ${message}${newline}${newline}Stacktrace: ${stacktrace}${newline}Callsite: ${callsite}${newline}Exception: ${exception}";
mailTarget.Subject = "NLog ${level} bij ${event-context:item=Bedrijf} (${event-context:item=DebId})";
if (GlobInfo.IsServer)
    mailTarget.Subject = "NLog Server ${level} bij ${event-context:item=Bedrijf} (${event-context:item=DebId})";

LoggingRule ruleMail = new LoggingRule("*", LogLevel.Error, new LimitingTargetWrapper(mailTarget, 100, TimeSpan.FromMinutes(30)));
ruleMail.Filters.Add(WhenFilter);
config.LoggingRules.Add(ruleMail);

//Sentry
var SentryTarget = new SentryTarget();
SentryTarget.Name = "Sentry";
[....]
SentryTarget.MinimumEventLevel = LogLevel.Error.ToString();
SentryTarget.MinimumBreadcrumbLevel = LogLevel.Debug.ToString();
SentryTarget.Options.InitializeSdk = true;
SentryTarget.Options.ShutdownTimeoutSeconds = 5;
SentryTarget.Options.AddTag("App", GlobInfo.IsServer ? "Server" : "Client");
SentryTarget.Options.AttachStacktrace = true;
SentryTarget.Options.Release = GlobInfo.UpdBuildnr.ToString();
SentryTarget.Options.Environment = GlobInfo.UpdVersie;
SentryTarget.IncludeCallSite = true;
SentryTarget.IncludeCallSiteStackTrace = true;
SentryTarget.Layout = "${message}";
SentryTarget.Options.BeforeSend = BeforeSend;

LoggingRule ruleSen = new LoggingRule("*", LogLevel.Error, new LimitingTargetWrapper(SentryTarget, 100, TimeSpan.FromMinutes(30)));
ruleSen.Filters.Add(WhenFilter);
config.LoggingRules.Add(ruleSen);

1 Ответ

1 голос
/ 09 июня 2019

Извлеките это как метод:

var WhenFilter = new WhenRepeatedFilter();
WhenFilter.Layout = "${message}";
WhenFilter.TimeoutSeconds = 600;
WhenFilter.Action = FilterResult.Ignore;
WhenFilter.IncludeFirst = false;
WhenFilter.FilterCountPropertyName = "filteredCount";
WhenFilter.FilterCountMessageAppendFormat = "\n\nIgnored: {0}";
return WhenFilter;

Вместо повторного использования одного и того же WhenFilter для обоих правил ведения журнала.

Альтернативно добавьте обе цели к одному правилу регистрации.

...