我已经将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();
}
}
}
答案 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。