Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有时间的日志文件名无法正常工作_Java_Xml_Logging_Log4j_Log4j2 - Fatal编程技术网

Java 带有时间的日志文件名无法正常工作

Java 带有时间的日志文件名无法正常工作,java,xml,logging,log4j,log4j2,Java,Xml,Logging,Log4j,Log4j2,我试图实现一个异步日志系统,按照log4j文档按照大小和间隔进行轮换 例如: <?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <Appenders> <RollingRandomAccessFile name="RollingRandomAccessFile" fileName="logs/app.lo

我试图实现一个异步日志系统,按照log4j文档按照大小和间隔进行轮换

例如:

<?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>

%d%p%c{1.}[%t]%m%n
我的配置:

<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>

|%d |%p |%c{1.}|[%t]|%m |%ex%n
我的结果是文件:

log\2018-04-04\foo-2018-04-04-17-1.log.gz

log\2018-04-04\foo-2018-04-04-17-2.log.gz

log\2018-04-04\foo-2018-04-04-17-3.log.gz

log\2018-04-04\foo-2018-04-04-17-4.log.gz

log\2018-04-04\foo-2018-04-04-17-5.log.gz

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

对于这些测试,我使用的文件大小为10KB,间隔为6。我做错了什么

编辑:

问题是间隔值,在本例中为6,将该值添加到文件名的时间。我如何修复此问题并继续旋转数小时

解决方案:


我通过使用CronTriggeringPolicy更改TimeBasedTriggeringPolicy来解决我的问题,该CronTriggeringPolicy的值为每三小时写入一次文件。这样,文件名和时间不会受到影响。

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

假设您希望时区为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"
有关更多信息,请参见文档表中的d{pattern}-date{pattern}行。
根据这一点,“您还可以根据
java.util.TimeZone.getTimeZone
使用一组包含时区id的大括号。如果没有提供日期格式说明符,则使用默认格式。”

这对我来说很有效,但在我的情况下,我必须添加“{GMT+1}”,感谢您的反馈。我也更新了解开这个的答案。今天我已经确认它不能正常工作。这不是日期格式的错误,而是时间间隔值的问题,在本例中6,将该值添加到文件名的时间。也许您需要重新表述问题的描述,因为如下所示:“log\2018-04-04\foo-2018-04-04-17-5.log.gz我的本地时间是2018-04-04 15:11:38724(写在日志内容中)。日志文件的名称应为:log\2018-04-04\foo-2018-04-04-15-n.log.gz“看来时间是问题所在,所以这个答案旨在回答这一部分。