Log4j2 Rolling appender - fileName根据模式“滑动”

时间:2015-05-05 17:17:51

标签: java logging log4j2

我正在寻找翻转策略,其中当前日志(活动输出目标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中可以吗? 感谢。

4 个答案:

答案 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政策。