如何手动轮换 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();
}
}
我将 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();
}
}