如何在log4j2中的每个服务器关闭时轮换日志

时间:2016-06-10 05:32:55

标签: java log4j log-rotation

现在我正在使用log4j2旋转日志,如果它达到2000MB并且基于时间,即每小时使用以下逻辑: -

<RollingRandomAccessFile name="test"
            fileName="${sys:log4j.logPath}/testlog" filePattern="${sys:log4j.logPath}/test-%d{yyyy-MM-dd-HH}-%i.log.gz">
            <PatternLayout>
                <Pattern>%d{ISO8601} %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="1990 MB" />
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingRandomAccessFile>

我还希望在服务器关闭时轮换日志。我必须添加到以下哪些配置?

我已经使用OnStartupTriggeringPolicy在关机时轮换日志。但是在服务器重启后发出单个请求后,日志会被轮换。

但我想在服务器关闭时轮换日志。有办法吗?

2 个答案:

答案 0 :(得分:1)

您的问题的标题是在服务器重启时轮换日志,但您的问题是在关机时轮换日志。旋转关闭日志是不可靠的,因为如果服务器或系统崩溃,文件将不会旋转。可以实现一个功能以在正常关闭时滚动,但是您需要为此为Log4j创建一个Jira问题。

Log4j 2支持OnStartupTriggeringPolicy。除非文件为空,否则它将导致文件在服务器启动时翻转。

答案 1 :(得分:1)

我找到了上述问题的解决方案。以下代码适用于我。

在log4j.xml中添加'shutdownHook =“禁用”

<Configuration status="WARN" shutdownHook="disable">

翻转方法(): -

public class RollOverLog4j {

    public static void rollover() {
        public final Logger logger = LogManager.getLogger("test");

        Map<String, Appender> appenders = ((org.apache.logging.log4j.core.Logger) logger).getAppenders();
        Iterator<Entry<String, Appender>> appenderIterator = appenders.entrySet().iterator();
        while (appenderIterator.hasNext()) {
            Appender appender = appenderIterator.next().getValue();
            if (appender instanceof RollingRandomAccessFileAppender) {
                ((RollingRandomAccessFileAppender) appender).getManager().rollover();
            }
        }
    }

}

在服务器停止时调用rollover(): -

RollOverLog4j.rollover()
// shutting down log4j manually
Configurator.shutdown((LoggerContext) LogManager.getContext());

注意: - rollover()不是log4 2.3版本中的公共方法。因此,请使用最新版本2.6使其正常工作。