java - 如何让 Log4j2 RollingFileAppender 创建新的日志文件并滚动现有文件
问题描述
如何配置 log4j2(当前使用 V2.13.3)以在每次应用启动时创建一个新的日志文件,并滚动任何现有文件,最多 10 个文件?
例如,应用程序第一次运行它会创建test.log
. 第二次运行现有的test.log
会被重命名,并且应用程序开始记录到新的test.log
. 等等。
我尝试了以下配置:
<Configuration>
<Appenders>
<RollingFile
name="file"
fileName="test.log"
filePattern="test-%d{yyyyMMdd-HHmmss}-%i.log"
append="false">
<PatternLayout pattern="%d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%c{2}] [%t]%n[%p] : %m%n"/>
<OnStartupTriggeringPolicy minSize="1"/>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="file"/>
</Root>
</Loggers>
</Configuration>
然而,滚动的日志文件永远不会被创建——log4j2 只是test.log
每次都保持覆盖。我的猜测是 log4j2 在调用 OnStartupTriggeringPolicy 之前创建新的日志文件,因此策略确定不需要滚动日志文件。AFAICS 这似乎是一个错误。
如果我将append="false"
标志更改为append="true"
,则创建滚动文件,但是第一次运行应用程序时,它会同时创建test.log
和test-yyyymmdd-hhmmss-1.log
文件(后者为空),并且对于每次后续运行,它都会使用原始文件名创建滚动文件test-yyyymmdd-hhmmss-n.log
,例如:
test-20200715-120227-1.log
test-20200715-120227-2.log
test-20200715-120227-3.log
(我希望每个滚动文件都有不同的 hhmmss 时间)。
奇怪的是,如果(保留append="true"
)我在滚动的日志文件名中添加了一个.gz
后缀,则:
filePattern="test-%d{yyyyMMdd-HHmmss}-%i.log.gz"
比我得到想要的行为:
test-20200715-143142-1.log.gz
test-20200715-143149-1.log.gz
test-20200715-143153-1.log.gz
解决方案
OnStartupTriggerPolicy 应该在 Policies 标签下
<Policies> <OnStartupTriggeringPolicy minSize="1"/> </Policies>
我会尝试这样的事情:
<Configuration>
<Appenders>
<RollingFile
name="file"
fileName="test.log"
filePattern="test-%d{yyyyMMdd-HHmmss}-%i.log"
append="false"
bufferedIO="false"
>
<PatternLayout>
<Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%c{2}] [%t]%n[%p] : %m%n
</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy minSize="1"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="file"/>
</Root>
</Loggers>
</Configuration>
推荐阅读
- angular-dart - AngularDart 材质颜色主题
- ios - Stack View 大小变化无法可视化
- webpack - 如何使用 vue-cli 安装其他 vue 版本不是最新的
- javascript - 从 PHP while 循环中随机化 jquery 中“DIV”的边框颜色
- android - 为 FrameLayout 内的所有自定义视图触发 OnClickListener
- c# - C#:在转换泛型类型时,为什么需要对象?
- amazon-web-services - 在 AWS 服务中存储特定于环境的配置变量时,我该怎么做?
- android - 如何在应用程序自动退出时获取通知并在关闭时清理数据
- javascript - Three.js - 通过鼠标移动和点击创建/更新网格
- sql - 我可以将 select 语句中的列名更改为从存储过程传入的参数吗?