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


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

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

Это возможно?

2 53

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);