我正在尝试每小时创建新的日志文件。我在RollingFileAppender中使用lo4j2的TimeBasedTriggerringPolicy。下面是我从log4j2官方站点获取的示例xml配置代码。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<RollingFile name="RollingFile" 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="1" modulate="true" />
**
<SizeBasedTriggeringPolicy size="250 MB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="RollingFile" />
</Root>
</Loggers>
</Configuration>
在区间属性中,我设置了1表示1小时。 但是我的文件仍然不会每1小时滚动一次。
请帮我找错。
注意:我已经包含了log4j2的beta9(这是最新的)
答案 0 :(得分:21)
1表示1天而不是1小时。我已使用以下配置手动测试。
<RollingFile name="T" fileName="/data_test/log/abc.log"
filePattern="/data_test/log/abc-%d{MM-dd-yyyy}-%i.log">
<PatternLayout>
<Pattern>%d{ISO8601} %-5p [%t] (%F:%L) - %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 KB" />
</Policies>
</RollingFile>
对于手动测试,我更改了系统日期和时间。 首先,尝试增加1小时。将生成日志文件,但不会按预期生成。 然后更改系统日期,增加1天,然后查看结果。
假设第29天至10月的最后一个日志文件(abc.log)为50 KB。配置大小为100 KB。如果我们改变一天(增加1天)然后运行。 然后,最后一个文件将被重命名为29-Oct-(某个序列号).log(复制时为50 KB文件),并使用abc.log创建新文件
我在web.xml
中使用以下配置的简单servlet尝试了这个<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>log4j2.xml</param-value>
</context-param>
将log4j2.xml保存在src文件夹中。如果我们将它保存在类路径中,则不会加载log4j2.xml。
答案 1 :(得分:5)
正如Abid所提到的,间隔值是在作为filePattern的一部分指定的模式的上下文中解释的。它从最低面额开始。例如,如果pattern包含S,则频率将以毫秒为单位。它支持日期模式,详细描述为SimpleDateFormat java doc http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
的一部分答案 2 :(得分:4)
Log4j documentations:
间隔 - &gt; (整数)基于最大值进行翻转的频率 日期模式中的特定时间单位。例如,带有日期 模式以小时为最具体的项目,增量为4 翻车每4个小时就会发生一次。默认值为1.
如果您想每小时创建一次,请更改文件名模式。
答案 3 :(得分:2)
你有一个非空的日志文件(否则无法翻转)?
请注意,即使名称为“TimeBased ...”,它也不会在指定时间实际翻转,而是在超过时间阈值后到达的第一个日志事件。你可以尝试一个小的测试程序,在61分钟左右后记录一些东西并查看问题是否仍然存在?
如果上述测试程序没有翻身,您可能发现了一个错误。在这种情况下,请在log4j问题跟踪器上提出它。 (请务必附上团队可用于重现问题的测试程序。)
答案 4 :(得分:0)
根据您的TimeBasedTriggeringPolicy配置,记录器只会每天而不是每小时填充一次日志。 AFAIK,您可以通过将filePattern从HH(Hours)更改为dd(Days)来实现此功能。
我修改了您的config.xml。试试这个
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
**
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
**
<SizeBasedTriggeringPolicy size="250 MB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="RollingFile" />
</Root>
</Loggers>
</Configuration>
有关更多详细信息,请检查this
希望这也将为您锻炼身体。
答案 5 :(得分:0)
时间间隔解释取决于您使用的文件模式。以下配置为我每秒滚动文件。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="A" target="SYSTEM_OUT">
<PatternLayout pattern="%d [%t] %-5p {%F:%L} %x - %m%n" />
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>
<RollingFile name="R"
fileName="/home/xxx/yyy/myapp.log" filePattern="/home/xxx/yyy/myapp-%d{yyyy-MM-dd-HH-mm-ss}-%i.log">
<PatternLayout pattern="%d [%t] %-5p {%F:%L} %x - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="A" />
<AppenderRef ref="R" />
</Root>
</Loggers>
</Configuration>