如何手动旋转log4j日志

3

我已经配置了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个回答

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

如果你想要滚动所有的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();
    }
}

使用 RollingRandomAccessFileAppender 时,请使用类似的代码。 - Remko Popma
@RemkoPopma,这个是否对您有用?我相信在log4j2 2.x版本中不提供rollover()。您知道有什么解决方法吗? - Galet

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

当我在log4j2中使用以下方法时,我收到了这条消息:“类型RollingFileManager的方法rollover(RolloverStrategy)不可见”。如何解决这个问题?或者我相信log42中没有rollover()方法。 - Galet
@karan,请检查您使用的RollingFileAppender是否属于org.apache.logging.log4j.core.appender包。 - Lahiru Chandima

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接