Условное ведение журнала с помощью log4net

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

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

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

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

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


person Luca    schedule 17.09.2014    source источник


Ответы (1)


TL;DR;

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

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

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

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

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

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

person samy    schedule 19.09.2014
comment
Хорошая идея. Но я вижу, что это невозможно сделать только в конфигурации, мы должны разработать расширение для Log4Net. Может быть, было бы проще войти в List‹String› и в конце программы решить, могу ли я отказаться от журнала или отправить все строки в List в метод реального журнала. - person Luca; 19.09.2014
comment
Да, многие люди решают не кодировать какое-то расширение для log4net для такого рода проблем, но тащить список строк и вставлять их в конец, на мой взгляд, немного похоже на запах кода: это возможно, возможно, на первый взгляд проще. но мне это не очень нравится. - person samy; 19.09.2014
comment
На самом деле, когда вы думаете об этом, добавление буфера является списком данных, которые хранятся за кулисами, поэтому я действительно рекомендую его использовать. - person samy; 19.09.2014
comment
Мне это тоже не нравится, но иногда нехватка времени и неопытность с log4net заставляют ставить затычки в носу :-( - person Luca; 19.09.2014
comment
В любом случае попробую в свободное время. Вы правы: список уже есть, так что лучше его использовать. - person Luca; 19.09.2014
comment
Я знаю :) Более того, этот случай здесь действительно особенный, так как вы должны думать о многих путях кода. В другом вашем вопросе (зарегистрируйте сообщение только один раз) решение намного яснее, поскольку есть только один путь для прохождения журнала. Удачи в решении этой проблемы. - person samy; 19.09.2014