Есть ли в любом случае программно очистить буфер в log4net
Я использую log4net с AdoNetAppender. Кажется, что AdoNetAppender имеет метод Flush. Есть ли в любом случае я могу назвать это из моего кода?
Я пытаюсь создать страницу администратора для просмотра всех записей в журнале базы данных, и я хотел бы настроить log4net с bufferSize=100 (или более), Затем я хочу, чтобы администратор мог нажать кнопку на странице администратора, чтобы заставить log4net записывать буферизованные записи журнала в базу данных (без выключения log4net).
Это возможно?
2 ответа:
предполагая, что вы используете log4net из коробки, вы можете выкопать свой путь вниз и очистить приложение следующим образом:
public void FlushBuffers() { ILog log = LogManager.GetLogger("whatever"); var logger = log.Logger as Logger; if (logger != null) { foreach (IAppender appender in logger.Appenders) { var buffered = appender as BufferingAppenderSkeleton; if (buffered != null) { buffered.Flush(); } } } }
Edit: я написал выше в предположении, что вы хотели, чтобы смыть аппендеры для конкретного
ILog
(вероятно, плохое предположение теперь, когда я перечитал вопрос), но, как указывает Стефан в комментарии ниже, вы можете немного упростить код, если хотите очистить все приложения по всему репозиторию как следует:public void FlushBuffers() { ILoggerRepository rep = LogManager.GetRepository(); foreach (IAppender appender in rep.GetAppenders()) { var buffered = appender as BufferingAppenderSkeleton; if (buffered != null) { buffered.Flush(); } } }
сегодня доступен более простой вариант:
LogManager.Flush();
сбрасывает события ведения журнала, буферизованные во всех настроенных приложениях в репозитории по умолчанию. https://logging.apache.org/log4net/release/sdk/html/M_log4net_LogManager_Flush.htm
настоятельно рекомендуется добавить тайм-аут, как
LogManager.Flush(3000);