日志文件名随时间不能正常工作

时间:2018-04-04 13:23:10

标签: java xml logging log4j log4j2

我正在尝试按照log4j文档的大小和间隔实现一个异步日志系统。

https://logging.apache.org/log4j/2.x/manual/appenders.html

这是一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <RollingRandomAccessFile name="RollingRandomAccessFile" fileName="logs/app.log"
                 filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
        <SizeBasedTriggeringPolicy size="250 MB"/>
      </Policies>
    </RollingRandomAccessFile>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="RollingRandomAccessFile"/>
    </Root>
  </Loggers>
</Configuration>

我的配置:

<RollingRandomAccessFile name="FooLog" fileName="${path}/foo.log" 
    filePattern="${path}/$${date:yyyy-MM-dd}/foo-%d{yyyy-MM-dd-HH}-%i.log.gz" immediateFlush="false">

    <PatternLayout>
        <Pattern>|%d|%p|%c{1.}|[%t]|%m|%ex%n</Pattern>
    </PatternLayout>

    <Policies>
        <TimeBasedTriggeringPolicy interval="${interval}" modulate="true" />
        <SizeBasedTriggeringPolicy size="${fileSize}" />
    </Policies>
</RollingRandomAccessFile>

我的结果是文件:

  

LOG \ 2018年4月4日\ FOO-2018-04-04-17-1.log.gz

     

LOG \ 2018年4月4日\ FOO-2018-04-04-17-2.log.gz

     

LOG \ 2018年4月4日\ FOO-2018-04-04-17-3.log.gz

     

LOG \ 2018年4月4日\ FOO-2018-04-04-17-4.log.gz

     

LOG \ 2018年4月4日\ FOO-2018-04-04-17-5.log.gz

我当地时间 2018-04-04 15:11:38,724 (写在日志内容中)。 日志文件的名称应为:log \ 2018-04-04 \ foo-2018-04-04-15-n.log.gz

我使用fileSize = 10 KB和interval = 6进行这些测试。我做错了什么?

修改

问题是间隔值,在这种情况下为6,将值添加到文件名的时间。我该如何解决这个问题并继续轮换几个小时?

SOLUTION:

我通过CronTriggeringPolicy更改TimeBasedTriggeringPolicy并使用一个值来解决我的问题,每三个小时写一次文件。这样,带有时间的文件名不受影响。

1 个答案:

答案 0 :(得分:1)

原因可能是记录器使用不同的时区。

假设您希望时区为UTC。

您可以尝试强制记录器使用特定的时区。

filePattern="${path}/$${date:yyyy-MM-dd}/foo-%d{yyyy-MM-dd-HH}{UTC}-%i.log.gz"

请注意在上面的代码段中添加了{UTC}。您需要将UTC替换为您选择的时区。

根据评论进行更新

由于需要GMT + 1时区,因此可以使用以下内容。

filePattern="${path}/$${date:yyyy-MM-dd}/foo-%d{yyyy-MM-dd-HH}{GMT+1}-%i.log.gz"

有关详细信息,可以在文档here的表格中看到 d {pattern} - date {pattern} 行。 根据“您还可以使用一组包含每java.util.TimeZone.getTimeZone时区ID的大括号。如果没有给出日期格式说明符,则使用DEFAULT格式。”