2014-09-17 3 views
1

У меня есть программа, которая использует log4Net, используя как текстовые, так и smtp-приложения.Условное ведение журнала с помощью log4net

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

Когда программа почти завершена, я могу обнаружить, что мне не нужно отправлять электронные письма, и на самом деле я записываю что-то вроде «ничего не делать».

Я знаю, что можно манипулировать по коду конфигурацией appenders, чтобы я мог подавить настройку почты Threshold to off.

Я хотел бы знать, можно ли получить тот же результат, используя только конфигурацию log4net: приложению smtp не следует отправлять электронное письмо, если конкретная строка регистрируется в любое время. Если вместо этого строка не регистрируется, она должна вести себя нормально и отправлять все строки, соответствующие указанным фильтрам.

ответ

1

TL; DR;

  • создать собственный ITriggeringEventEvaluator
  • настроить ваш SMTP Appender с этим оценщиком: решить, что должно произойти, когда буфер заполнен (отбрасывать сообщения, отправлять их)
  • использовать авто-флеш вашего Appender отправить журнал событий вперед

Есть два свойства в BufferingAppenderSkeleton в log4net, которые могут вас заинтересовать здесь. Когда вы настраиваете такой appender как Lossy, Evaluator и LossyEvaluator используются, чтобы определить, следует ли отправлять сообщения следующим добавкам.

Свойство Evaluator позволяет определить класс, наследующий от ITriggeringEventEvaluator; когда сообщение записывается в журнал и заполняется буфер, вызывается оценщик, и если он возвращает true в методе IsTriggeringEvent, буфер событий обрабатывается. LossyEvaluator работает таким же образом, за исключением того, что он вызывается для того, чтобы решить, должно ли регистрироваться самое старое событие, которое исчезнет из буфера, поскольку оно заполнено.

Поскольку ваша SmtpAppender является BufferingAppenderSkeleton, вы можете использовать Evaluator свойство для того, чтобы определить, что вызывает или нет электронной почты отправляется (т.е. событие регистрации, где вы говорите «нет журнал», или любой другой)

Однако если вы ожидаете, что ваш приятель самостоятельно примет решение о том, отправлять ли журналы событий, когда он закрыт (т. е. он автоматически сбрасывается или нет), используется LossyEvaluator.

Теперь для плохих новостей: в log4net есть только один экземпляр реализации ITriggeringEventEvaluator, который оценивает события журнала на основе их уровня. Таким образом, вам придется запрограммировать свой собственный триггер, чтобы распознать специальные сообщения, отправленные приложением вашим приложением.

+0

Хорошая идея. Но я вижу, что это невозможно сделать только при настройке, мы должны разработать расширение для Log4Net. Возможно, было бы проще «войти» в список и в конце программы решить, могу ли я отбросить журнал или отправить все строки в List в метод реального журнала. – Luca

+0

Да, многие люди решат против кодирования некоторого расширения для log4net для этой проблемы, но тащить список строк и подталкивать его в конце - это немного запаха кода, на мой взгляд: возможно, возможно, сначала проще взгляд, но мне это не очень нравится. – samy

+0

На самом деле, когда вы думаете об этом, буфер appender _is_ - список данных, который хранится за кулисами, поэтому я бы действительно рекомендовал его использовать. – samy

 Смежные вопросы

  • Нет связанных вопросов^_^