Java 带有时间的日志文件名无法正常工作
我试图实现一个异步日志系统,按照log4j文档按照大小和间隔进行轮换 例如: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
<?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“看来时间是问题所在,所以这个答案旨在回答这一部分。