Буферизация сообщений журнала в NLog и ручная очистка их для цели - PullRequest
10 голосов
/ 16 ноября 2011

Я пытаюсь войти через NLog MailTarget.Это работает просто отлично, но я хотел обернуть mailtarget BufferedTargetWrapper, чтобы буферизовать сообщения журнала до предопределенной кодовой точки, где я хочу вручную очистить буфер и отправить предварительно буферизованные сообщения журнала по одной почте (как определено вцель почты).

Если я определю FlushTimeout или BufferSize из BufferedTargetWrapper, то все будет работать нормально, как и предполагалось.Но если FlushTimeout и BufferSize не установлены, я не могу заставить его работать.

Как ответили в этом вопросе на SO Заставьте BufferingTargetWrapper опуститься У меня нет ничего подобного:

 LogManager.Configuration.AllTargets.Where(t => t != null && t is BufferingTargetWrapper).ToList().
            ForEach(b => ((BufferingTargetWrapper)b).Flush(null));

Но документация и этот ответ противоречат моей версии NLog (2.0.0.2000).Нет метода сброса без параметров, только метод сброса для асинхронных целей.

Есть ли способ заставить BufferingTargetWrapper сбрасывать все зарегистрированные сообщения в обернутую цель (чтобы отправить ее по почте)?

1 Ответ

16 голосов
/ 23 ноября 2011

Согласно документации ваш подход не должен работать, но это нормально.Просто дайте методу flush пустое лямбда-выражение:

LogManager.Configuration.AllTargets
    .OfType<BufferingTargetWrapper>()
    .ToList()
    .ForEach(b => b.Flush(e =>
        {
            //do nothing here
        }));
...