如何在 log4j2 中的每个服务器关闭时轮换日志
How to rotate logs on every server shutdown in log4j2
现在我正在使用 log4j2 旋转日志,如果它达到 2000MB 并且基于时间,即每小时使用以下逻辑:-
<RollingRandomAccessFile name="test"
fileName="${sys:log4j.logPath}/testlog" filePattern="${sys:log4j.logPath}/test-%d{yyyy-MM-dd-HH}-%i.log.gz">
<PatternLayout>
<Pattern>%d{ISO8601} %m%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="1990 MB" />
<TimeBasedTriggeringPolicy />
</Policies>
</RollingRandomAccessFile>
我还想在服务器关闭时轮换日志。我必须向以下内容添加什么配置?
我已经使用 OnStartupTriggeringPolicy 在关机时轮换日志。但是在服务器重启时发出单个请求后,日志会轮换。
但我希望在服务器关闭时轮换我的日志。有办法吗?
你的问题的标题是在服务器重启时轮换日志,但你的问题是在关机时轮换日志。在关机时旋转日志是不可靠的,因为如果服务器或系统崩溃,文件将不会旋转。可以实施一项功能以在正常关机时滚动,但您需要为此为 Log4j 创建一个 Jira 问题。
Log4j 2 支持 OnStartupTriggeringPolicy。会导致服务器启动时文件翻转,除非文件为空。
我已经找到上述问题的解决方案。以下代码对我有用。
在log4j.xml
中添加'shutdownHook="disable"'
<Configuration status="WARN" shutdownHook="disable">
翻转方法():-
public class RollOverLog4j {
public static void rollover() {
public final Logger logger = LogManager.getLogger("test");
Map<String, Appender> appenders = ((org.apache.logging.log4j.core.Logger) logger).getAppenders();
Iterator<Entry<String, Appender>> appenderIterator = appenders.entrySet().iterator();
while (appenderIterator.hasNext()) {
Appender appender = appenderIterator.next().getValue();
if (appender instanceof RollingRandomAccessFileAppender) {
((RollingRandomAccessFileAppender) appender).getManager().rollover();
}
}
}
}
服务器停止时调用 rollover():-
RollOverLog4j.rollover()
// shutting down log4j manually
Configurator.shutdown((LoggerContext) LogManager.getContext());
注意:- rollover() 不是 log4 2.3 版本中的 public 方法。所以使用最新版本 2.6 使其工作。
现在我正在使用 log4j2 旋转日志,如果它达到 2000MB 并且基于时间,即每小时使用以下逻辑:-
<RollingRandomAccessFile name="test"
fileName="${sys:log4j.logPath}/testlog" filePattern="${sys:log4j.logPath}/test-%d{yyyy-MM-dd-HH}-%i.log.gz">
<PatternLayout>
<Pattern>%d{ISO8601} %m%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="1990 MB" />
<TimeBasedTriggeringPolicy />
</Policies>
</RollingRandomAccessFile>
我还想在服务器关闭时轮换日志。我必须向以下内容添加什么配置?
我已经使用 OnStartupTriggeringPolicy 在关机时轮换日志。但是在服务器重启时发出单个请求后,日志会轮换。
但我希望在服务器关闭时轮换我的日志。有办法吗?
你的问题的标题是在服务器重启时轮换日志,但你的问题是在关机时轮换日志。在关机时旋转日志是不可靠的,因为如果服务器或系统崩溃,文件将不会旋转。可以实施一项功能以在正常关机时滚动,但您需要为此为 Log4j 创建一个 Jira 问题。
Log4j 2 支持 OnStartupTriggeringPolicy。会导致服务器启动时文件翻转,除非文件为空。
我已经找到上述问题的解决方案。以下代码对我有用。
在log4j.xml
中添加'shutdownHook="disable"'<Configuration status="WARN" shutdownHook="disable">
翻转方法():-
public class RollOverLog4j {
public static void rollover() {
public final Logger logger = LogManager.getLogger("test");
Map<String, Appender> appenders = ((org.apache.logging.log4j.core.Logger) logger).getAppenders();
Iterator<Entry<String, Appender>> appenderIterator = appenders.entrySet().iterator();
while (appenderIterator.hasNext()) {
Appender appender = appenderIterator.next().getValue();
if (appender instanceof RollingRandomAccessFileAppender) {
((RollingRandomAccessFileAppender) appender).getManager().rollover();
}
}
}
}
服务器停止时调用 rollover():-
RollOverLog4j.rollover()
// shutting down log4j manually
Configurator.shutdown((LoggerContext) LogManager.getContext());
注意:- rollover() 不是 log4 2.3 版本中的 public 方法。所以使用最新版本 2.6 使其工作。