Как очистить буферизованный log4j FileAppender? - PullRequest
17 голосов
/ 17 июня 2010

В log4j, при использовании FileAppender со свойствами BufferedIO = true и BufferSize = xxx (т. Е. Включена буферизация), я хочу иметь возможность очистить журнал во время обычной процедуры завершения работы. Есть идеи как это сделать?

Ответы [ 6 ]

37 голосов
/ 20 июня 2010

Мне удалось ответить на мой собственный вопрос: -)

При завершении работы LogManager:

LogManager.shutdown();

все буферизованные журналы сбрасываются.

6 голосов
/ 06 июля 2010
public static void flushAllLogs()
{
    try
    {
        Set<FileAppender> flushedFileAppenders = new HashSet<FileAppender>();
        Enumeration currentLoggers = LogManager.getLoggerRepository().getCurrentLoggers();
        while(currentLoggers.hasMoreElements())
        {
            Object nextLogger = currentLoggers.nextElement();
            if(nextLogger instanceof Logger)
            {
                Logger currentLogger = (Logger) nextLogger;
                Enumeration allAppenders = currentLogger.getAllAppenders();
                while(allAppenders.hasMoreElements())
                {
                    Object nextElement = allAppenders.nextElement();
                    if(nextElement instanceof FileAppender)
                    {
                        FileAppender fileAppender = (FileAppender) nextElement;
                        if(!flushedFileAppenders.contains(fileAppender) && !fileAppender.getImmediateFlush())
                        {
                            flushedFileAppenders.add(fileAppender);
                            //log.info("Appender "+fileAppender.getName()+" is not doing immediateFlush ");
                            fileAppender.setImmediateFlush(true);
                            currentLogger.info("FLUSH");
                            fileAppender.setImmediateFlush(false);
                        }
                        else
                        {
                            //log.info("fileAppender"+fileAppender.getName()+" is doing immediateFlush");
                        }
                    }
                }
            }
        }
    }
    catch(RuntimeException e)
    {
        log.error("Failed flushing logs",e);
    }
}
3 голосов
/ 30 июня 2017
public static void flushAll() {
    final LoggerContext logCtx = ((LoggerContext) LogManager.getContext());
    for(final org.apache.logging.log4j.core.Logger logger : logCtx.getLoggers()) {
        for(final Appender appender : logger.getAppenders().values()) {
            if(appender instanceof AbstractOutputStreamAppender) {
                ((AbstractOutputStreamAppender) appender).getManager().flush();
            }
        }
    }
}
1 голос
/ 23 декабря 2010

Возможно, вы могли бы переопределить WriterAppender#shouldFlush( LoggingEvent ), поэтому он вернул бы true для специальной категории ведения журнала, такой как log4j.flush.now, и затем вы позвоните:

LoggerFactory.getLogger("log4j.flush.now").info("Flush")

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/WriterAppender.html#shouldFlush%28org.apache.log4j.spi.LoggingEvent%29

0 голосов
/ 26 февраля 2015

Я написал приложение, которое исправляет это, см. GitHub или используйте name.wramner.log4j: FlushAppender в Maven.Он может быть настроен на сброс событий с высокой степенью серьезности, и он может отключить буферизацию для получателей при получении определенного сообщения, например «Завершение работы».Проверьте модульные тесты для примеров конфигурации.Это бесплатно, конечно.

0 голосов
/ 17 июня 2010

Попробуйте:

LogFactory.releaseAll();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...