我正在寻找翻转策略,其中当前日志(活动输出目标在manual的术语中)文件名不固定但由模式指定,或者 - 更确切地说 - 相同filePattern
属性中的模式。
我想实现每日翻转,今天的日志就是log-2015-05-05.log
,而午夜框架就停止编写并开始写入log-2015-05-06.log
。但是,AFAIK,当前配置只允许
<RollingFile name="ROLFILE"
fileName="log.log"
filePattern="log-%d{yyyy-MM-dd}.log"
>
在fileName
属性中指定相同的值不起作用(导致具有字面解释的敏感字符的文件)。我注意到fileName
这样的动态值没有示例或SO问题。请注意,fileName="log-${date:yyyy-MM-dd}.log"
无法解决问题,因为表达式仅在启动时进行评估,并且即使事件的时间戳与表达式不匹配,事件仍会发送到文件中。
我正在从Log4j 1.2迁移到Log4j 2.2。在旧版本中,使用
可以实现所需的行为<appender name="ROLFILE" class="org.apache.log4j.rolling.RollingFileAppender">
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern" value="log-%d{yyyy-MM-dd}.log" />
</rollingPolicy>
...
我更喜欢保留当前的方式,因为一些日志分析工具依赖它。 在Log4j2中可以吗? 感谢。
答案 0 :(得分:0)
请注意这是否有效,但您可以尝试在日期查找中使用双$$
。这允许在运行时解析变量。
<RollingFile name="ROLFILE"
fileName="log-$${date:yyyy-MM-dd}.log"
filePattern="oldlog-%d{yyyy-MM-dd}.log"
>
您可能需要注意确保活动输出目标文件名与后翻转文件名不同。 (我在上面的代码片段中使用了'oldlog'。)
答案 1 :(得分:0)
最后,我写了my own rollover strategy,它生成了不同的翻转动作集。而是重命名活动文件,只需在RollingFileManager
内替换活动文件名。是的,它是丑陋的反射黑客,并且必须使用与当前日期相对应且具有相同模式的fileName
常量来初始化appender,例如。
<RollingFile name="ROLFILE"
fileName="log-${date:yyyy-MM-dd}.log"
filePattern="log-%d{yyyy-MM-dd}.log"
>
<SlidingFilenameRolloverStrategy />
...
对我而言,尽管有这些小缺点,但这个解决方案值得做。
(初始fileName
永远留在AbstractManager
注册表MAP
中作为密钥,即使在经理本身已被更改 - 似乎不介意,我也尝试在注册表中替换管理员一,但不可能收集其构造所需的所有参数。)
如果RollingFileManager
API使正常的方式成为可能,我希望这个黑客不应该如此丑陋。我有一些希望看到this javadoc,但框架AFAIK从不使用这个字段,更不用说变异RollingFileAppender
。
答案 2 :(得分:0)
我认为它可以正常使用:
fileName="log-${date:yyyy-MM-dd}.log"
filePattern="log-%d{yyyy-MM-dd}.log"
我在log4j2版本2.5中使用它
答案 3 :(得分:-1)
这已在 Log4j 2.8 中实施(请参阅issue LOG4J2-1101)。
目前它只适用于RollingFile
appender,省略filename
参数并使用DirectWriteRolloverStrategy
。
此外,此功能似乎与TimeBasedTriggeringPolicy
存在一些问题(第一次翻转不会发生,因此每个日志文件都会偏移一个间隔); CronTriggeringPolicy
正常运作。
示例配置:
<RollingRandomAccessFile name="MyLogger"
filePattern="logs/application.%d{yyyy-MM-dd}.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<CronTriggeringPolicy schedule="0 * * * * ?" evaluateOnStartup="true"/>
</Policies>
<DirectWriteRolloverStrategy/>
</RollingRandomAccessFile>
issue LOG4J2-1878请求支持RollingRandomAccessFile
appender。
编辑: 在找到TimeBasedTriggeringPolicy时遇到问题,已更改为CronTriggeringPolicy政策。