如何手动旋转log4j日志

时间:2015-11-30 10:14:57

标签: java rotation log4j

我已经将log4j配置为每天旋转日志。

在特殊情况下,我想手动触发额外的日志轮换。

这可能 - 如果是这样的话:怎么样?

解决方式如下:

void rolloverLogs() {
    for(final Enumeration<?> loggers = LogManager.getCurrentLoggers(); loggers.hasMoreElements(); )  {

        final Logger logger = (Logger) loggers.nextElement();

        for (final Enumeration<?> appenders = logger.getAllAppenders(); appenders.hasMoreElements(); )  {

            final Appender a = (Appender) appenders.nextElement();

            if(!RollingFileAppender.class.isInstance(a))
                continue;

            ((RollingFileAppender)a).rollOver();
        }
    }
}

3 个答案:

答案 0 :(得分:4)

Lahiru显示的技术只会找到为特定Logger配置的Appender,它基于代码所在的类。如果配置发生变化,确切的Appender可能会有所不同。

如果您知道Appender名称,最好的方法是:

org.apache.logging.log4j.core.LoggerContext context = LogManager.getContext(false);
Appender appender = context.getConfiguration().getAppender(appenderName);
if (appender instanceof RollingFileAppender) {
    ((RollingFileAppender) appender).getManager().rollover();
}

如果您想翻转所有RollingFileAppender,您可以这样做:

org.apache.logging.log4j.core.LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
for (Appender appender : context.getConfiguration().getAppenders().values()) {
    if (appender instanceof RollingFileAppender) {
        ((RollingFileAppender) appender).getManager().rollover();
    }
}

答案 1 :(得分:3)

对于log4j2,您可以使用以下内容。

    org.apache.logging.log4j.Logger logManagerLogger = LogManager.getLogger();
    Map<String, org.apache.logging.log4j.core.Appender> appenders = ((org.apache.logging.log4j.core.Logger) logManagerLogger).getAppenders();
    appenders.forEach((appenderName, appender) -> {
        if (appender instanceof RollingFileAppender) {
            logger.info("Rolling over appender " + appenderName);
            ((RollingFileAppender) appender).getManager().rollover();
        }
    });

答案 2 :(得分:2)

如果你正在跟踪你的appender,你可以打电话

https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/RollingFileAppender.html#rollOver()

应该这样做。我想也可以遍历从根级别开始可以找到的所有appender - 只需确保跟踪已经滚动的appender。