首页 > 解决方案 > log4j2如何选择会话而不是日期

问题描述

在 log4j2 上,我可以根据以下行轻松地根据日期登录到文件。

<File name="file" fileName="logs/te_${date:yyyy}-${date:MM}-${date:dd}_output.log" append="true">

在某些行业中,存在跨越午夜的会话概念
说电影院,在某些国家,电影在午夜后开始。
因此,我希望将日志捕获为将在凌晨 4 点结束/开始的会话。

一天中任何时候你会开始程序,它会检查:

// pseudo code
if time < 04:00 then
    session = today.minusDays(1)
else 
    session = today

因此,为了清楚起见,程序启动时的日志文件名称如下:

# starting datetime |  logfile name
2020-05-20 22:00 -> "2020-05-20_output.log"
2020-05-21 01:00 -> "2020-05-20_output.log"
2020-05-21 03:00 -> "2020-05-20_output.log"
2020-05-21 05:00 -> "2020-05-21_output.log"

无论如何我可以在 log4j2.xml 文件上做到这一点?

标签: log4jlog4j2

解决方案


如果不是很清楚你想在凌晨 4 点发生什么。听起来您想开始写入另一个文件。如果是这样,您希望将 RollingFileAppender 与 CronTriggeringPolicy 一起使用。

<RollingFile name="RollingFile" filePattern="logs/te_%d{yyyy:MM:dd}_output.log">
  <PatternLayout>
    <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
  </PatternLayout>
  <CronTriggeringPolicy schedule="0 0 4 * * ?"/>
</RollingFile>

推荐阅读