Есть ли способ программно очистить буфер в log4net? - PullRequest
55 голосов
/ 12 января 2010

Я использую log4net с AdoNetAppender. Похоже, что AdoNetAppender имеет метод Flush . В любом случае я могу назвать это из моего кода?

Я пытаюсь создать страницу администратора для просмотра всех записей в журнале базы данных, и я хочу настроить log4net с bufferSize = 100 (или более), затем я хочу, чтобы администратор мог нажать кнопку на странице администратора вынудить log4net записать буферизованные записи журнала в базу данных (без выключения log4net).

Возможно ли это?

Ответы [ 2 ]

82 голосов
/ 12 января 2010

Предполагая, что вы используете 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();
        }
    }
}
4 голосов
/ 18 сентября 2018

Сегодня доступен более простой вариант:

LogManager.Flush();

Сбрасывает события журнала, буферизованные во всех настроенных приложениях в репозитории по умолчанию. https://logging.apache.org/log4net/release/sdk/html/M_log4net_LogManager_Flush.htm

Настоятельно рекомендуется добавить тайм-аут, например

LogManager.Flush(3000);
...