Есть ли способ программимо промыть буфер в log4net
-
20-09-2019 - |
Вопрос
Я использую log4net с AdonetAppender. Похоже, у AdonetAppender есть Метод промывки. Анкет Есть ли в любом случае, я могу позвонить это из моего кода?
Я пытаюсь создать страницу администратора для просмотра всех записей в журнале базы данных, и я хотел бы настроить log4net с помощью Buffersize = 100 (или более), тогда я хочу, чтобы администратор мог нажать кнопку на администрации Page, чтобы заставить log4net написать записи журнала буферизации в базу данных (без выключения log4net).
Это возможно?
Решение
Предполагая, что вы используете 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();
}
}
}
}
Редактировать: Я написал вышеупомянутое в предположении, что вы хотели промыть приложения для конкретного ILog
(Вероятно, сейчас плохое предположение, когда я перечитал вопрос), но, как указывает Стефан в комментарии ниже, вы можете немного упростить код, если хотите промыть всех приложений по всему репозиторию следующим образом:
public void FlushBuffers()
{
ILoggerRepository rep = LogManager.GetRepository();
foreach (IAppender appender in rep.GetAppenders())
{
var buffered = appender as BufferingAppenderSkeleton;
if (buffered != null)
{
buffered.Flush();
}
}
}
Другие советы
Today simpler option is available:
LogManager.Flush();
Flushes logging events buffered in all configured appenders in the default repository. https://logging.apache.org/log4net/release/sdk/html/M_log4net_LogManager_Flush.htm
It is highly recommended to add a timeout, like
LogManager.Flush(3000);