如何手动轮换 log4j 日志

How to rotate a log4j log manually

我将 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();
        }
    }
}

如果您正在跟踪您的附加程序,您可以调用

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

应该可以了。我想也可以从根级别开始遍历所有可以找到的附加程序 - 只要确保跟踪已经滚动的附加程序即可。

对于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();
        }
    });

Lahiru 展示的技术只会定位为特定 Logger 配置的 Appender,该 Logger 基于代码所在的 class。如果配置发生变化,定位的确切 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();
}

如果你想滚动所有 RollingFileAppenders 你可以这样做:

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();
    }
}