当JVM退出时,如何刷新log4j附加器?

当JVM退出时,如何刷新log4j附加器?,log4j,rollingfileappender,Log4j,Rollingfileappender,我在log4j.properties中使用的是bufferedIO=true和bufferSize=8KB,但假设服务器由于某种原因崩溃/重新启动,并且缓冲区未满,则缓冲区中的日志将丢失。那么如何恢复这些日志呢?如果JVM崩溃,它们将无法恢复。它们被缓冲在内存中,当程序崩溃时,内存基本上就消失了 如果JVM只是出于某种原因退出,那么可以使用shutdownhook。LogManager.shutdown()将刷新日志()。因此,只需将其添加为关机挂钩就足够了 /** * Demonstrati

我在log4j.properties中使用的是bufferedIO=true和bufferSize=8KB,但假设服务器由于某种原因崩溃/重新启动,并且缓冲区未满,则缓冲区中的日志将丢失。那么如何恢复这些日志呢?

如果JVM崩溃,它们将无法恢复。它们被缓冲在内存中,当程序崩溃时,内存基本上就消失了

如果JVM只是出于某种原因退出,那么可以使用shutdownhook。LogManager.shutdown()将刷新日志()。因此,只需将其添加为关机挂钩就足够了

/**
 * Demonstrating how to flush buffered log4j logs to file when virtual machine exits.
 *
 */
public class Log4JBufferWriterOnJVMExit {

public static void main(String[] args) throws IOException {
    Logger log = initializeSomeLogToTestTheFlushing();

    log.info("Here");

    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run() {
            LogManager.shutdown();
        }        
    });
}    

private static Logger initializeSomeLogToTestTheFlushing() throws IOException {
    FileAppender fileAppender = new FileAppender(new SimpleLayout(), "buffered.log", false, true, 8 * 1204);
    Logger.getRootLogger().removeAllAppenders();
    Logger.getRootLogger().addAppender(fileAppender);
    Logger log = Logger.getLogger(Log4JBufferWriterOnJVMExit.class);
    return log;
}
}

感谢您的快速响应,但在服务器崩溃/重新启动之前,他们还有其他方法从内存中提取日志吗?这取决于服务器崩溃的方式。如果JVM崩溃,那么我们只能做很少的事情(进程的完整内存转储应该在某个地方包含缓冲区)。如果某个异常导致JVM退出,那么添加刷新日志缓冲区的关机钩子可能会起作用(请参阅。对于刷新日志4j缓冲区,似乎已经有了答案()。类似的主题:yobo