我在 log4j.properties 中使用 bufferedIO=true 和 bufferSize=8KB,但假设服务器由于某种原因崩溃/重新启动并且缓冲区未满,那么缓冲区中的日志将会丢失。那么如何恢复这些日志呢?
问问题
5413 次
1 回答
4
如果 JVM 崩溃,它们将无法恢复。它们被缓冲在内存中,当程序崩溃时,内存基本上就消失了。
如果 JVM 只是出于某种原因退出,则可以使用关闭挂钩。LogManager.shutdown() 将刷新日志(https://stackoverflow.com/a/3078377/647701)。因此,只需将其添加为关闭挂钩就足够了。
/**
* 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;
}
}
于 2013-06-17T05:54:28.313 回答