log4j2中基于时间的触发策略

z6psavjg  于 2022-11-06  发布在  其他
关注(0)|答案(7)|浏览(192)

我正在尝试每小时创建一个新的日志文件。我在RollingFileAppender中使用了lo4j2的TimeBasedTriggeringPolicy。下面是我从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>

在interval属性中我设置了1,表示1小时。但我的文件仍然不是每1小时滚动一次。
请帮我找出任何错误。
注意:我已经包括了log4j2的beta9(这是最新的)

tmb3ates

tmb3ates1#

这里的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天,然后查看结果。
假设10月29日的最后一个日志文件(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保存在类路径中,则不会加载它。

t2a7ltrp

t2a7ltrp2#

日志4j documentations
interval -〉(integer)根据日期模式中最特定的时间单位进行变换的频率。例如,在日期模式中,最特定的项是小时,并且增量为4,则每4小时进行一次变换。默认值为1。
如果您希望每小时创建一次文件名,则应更改文件名模式。

hgb9j2n6

hgb9j2n63#

如Abid所述,interval值在指定为filePattern的一部分的模式上下文中解释。它以最小单位开始。例如,如果模式包含S,则频率将以毫秒为单位。它支持SimpleDateFormat java doc http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html中详细描述的日期模式

jv2fixgn

jv2fixgn4#

您是否有非空的日志文件(否则没有可滚动的内容)?
请注意,即使名称是“TimeBased...”,它实际上也不会在指定的时间滚动,而是在超过时间阈值后到达的第一个日志事件时滚动。您是否可以尝试使用一个小的测试程序,在大约61分钟后记录一些内容,看看问题是否仍然发生?
如果上面的测试程序没有更新,你可能发现了一个bug。在这种情况下,请在log4j问题跟踪器上提出它。(一定要附上测试程序,团队可以使用它来重现问题)。

unftdfkk

unftdfkk5#

时间间隔的解释取决于您使用的文件模式。以下配置每秒为我滚动一次文件。

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

vm0i2vca6#

每天滚动

<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app.%d{yyyy-MM-dd}.log" ...>
   ...
<TimeBasedTriggeringPolicy interval="1" modulate="true" />

每天滚动小时数

<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app.%d{yyyy-MM-dd-HH}.log" ...>
   ...
<TimeBasedTriggeringPolicy interval="1" modulate="true" />

每天5天滚动

<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app.%d{yyyy-MM-dd}.log" ...>
   ...
<TimeBasedTriggeringPolicy interval="5" modulate="true" />

每天5小时滚动

<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app.%d{yyyy-MM-dd-HH}.log" ...>
   ...
<TimeBasedTriggeringPolicy interval="5" modulate="true" />

每月滚动

<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app.%d{yyyy-MM}.log" ...>
   ...
<TimeBasedTriggeringPolicy interval="1" modulate="true" />

希望这些案例能很好地帮助我们理解filePattern和interval是如何关联的。

g9icjywg

g9icjywg7#

根据您的TimeBasedTriggeringPolicy配置,logger将只填充每天的日志,而不是每小时。AFAIK,您可以通过将filePattern从HH(小时)更改为dd(天)来实现该功能。
我已经修改了您的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
希望这对你也有好处。

相关问题