如何在 log4j2 中每次服务器关闭时轮换日志
Posted
技术标签:
【中文标题】如何在 log4j2 中每次服务器关闭时轮换日志【英文标题】:How to rotate logs on every server shutdown in log4j2 【发布时间】:2016-10-10 23:15:05 【问题描述】:现在我正在使用 log4j2 旋转日志,如果它达到 2000MB 并且基于时间,即每小时使用以下逻辑:-
<RollingRandomAccessFile name="test"
fileName="$sys:log4j.logPath/testlog" filePattern="$sys:log4j.logPath/test-%dyyyy-MM-dd-HH-%i.log.gz">
<PatternLayout>
<Pattern>%dISO8601 %m%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="1990 MB" />
<TimeBasedTriggeringPolicy />
</Policies>
</RollingRandomAccessFile>
我还想在服务器关闭时轮换日志。我必须在下面添加什么配置?
我使用 OnStartupTriggeringPolicy 在关机时轮换日志。但是在通过服务器重新启动发出单个请求后,日志会被轮换。
但我希望在服务器关闭时轮换我的日志。有什么办法吗?
【问题讨论】:
也许可以看看这里:[***.com/questions/1444520/…(虽然我不完全理解你想要什么) 【参考方案1】:您的问题的标题是在服务器重启时轮换日志,但您的问题是在关机时轮换日志。在关机时轮换日志是不可靠的,因为如果服务器或系统崩溃,文件将不会轮换。可以实现一项功能以在正常关机时滚动,但您需要为此为 Log4j 创建 Jira 问题。
Log4j 2 支持 OnStartupTriggeringPolicy。服务器启动时会导致文件翻转,除非文件为空。
【讨论】:
我已经更新了我的标题。我也尝试过 OnStartupTriggeringPolicy。当我们在服务器重新启动后发出第一个请求时,它的触发和日志写入。但是我需要像 java 中的 finally 块一样在关机时轮换登录。 请创建一个 Jira 问题来请求这个。【参考方案2】:我已经找到了解决上述问题的方法。以下代码对我有用。
在 log4j.xml 中添加 'shutdownHook="disable"'
<Configuration status="WARN" shutdownHook="disable">
rollover()的方法:-
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 版本中不是公共方法。因此,请使用最新版本 2.6 使其工作。
【讨论】:
以上是关于如何在 log4j2 中每次服务器关闭时轮换日志的主要内容,如果未能解决你的问题,请参考以下文章
Linux日志管理神器之Logrotate日志分割,以及crontab定时轮询
十一springboot 配置log4j2以及打包成zip文件