Есть ли способ программно очистить буфер в log4net? - программирование
Подтвердить что ты не робот

Есть ли способ программно очистить буфер в log4net?

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

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

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

4b9b3361

Ответ 1

Предполагая, что вы используете 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 (вероятно, плохое предположение сейчас, когда я перечитываю вопрос), но как Stefan в нижеследующем комментарии, вы можете немного упростить код, если хотите сбросить все приставки по всему репозиторию следующим образом:

public void FlushBuffers()
{
    ILoggerRepository rep = LogManager.GetRepository();
    foreach (IAppender appender in rep.GetAppenders())
    {
        var buffered = appender as BufferingAppenderSkeleton;
        if (buffered != null)
        {
            buffered.Flush();
        }
    }
}

Ответ 2

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

LogManager.Flush();

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

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

LogManager.Flush(3000);