如何在Log4j中使用基于大小的触发策略和基于时间的滚动策略?

6ss1mwsb  于 2022-11-23  发布在  其他
关注(0)|答案(4)|浏览(258)

你好,我正在使用Log4j进行日志记录。下面是我的配置。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="true"
xmlns:log4j='http://jakarta.apache.org/log4j/'>

<appender name="FileAppender_Comp3" class="org.apache.log4j.rolling.RollingFileAppender"> 

<rollingPolicy name="file" class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
<param name="FileNamePattern" value="log/Comp3_%d{dd-MM-yyyy HH-mm-ss}.log" />
</rollingPolicy> 

<triggeringPolicy class="org.apache.log4j.rolling.SizeBasedTriggeringPolicy">
<param name="MaxFileSize" value="3kb"/>
</triggeringPolicy>

<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %5p [%t] %c (%F:%L) - %m%n"/>
</layout>

</appender>

但当我运行文件时,它抛出以下错误。

log4j:WARN Failed to set property [maxFileSize] to value "3kb".

我该怎么办。请帮帮我。

q35jwt9p

q35jwt9p1#

如果使用Log4j 2,则可以KB或MB为单位指定大小。
相关XML如下。

<Policies>
    <!-- Starts a new log on tomcat start -->
    <OnStartupTriggeringPolicy /> 
    <!--  Starts a new file when size reaches threshold -->
    <SizeBasedTriggeringPolicy size="10 MB" /> 
    <!-- causes a rollover once the date/time pattern no longer 
       applies to the active file -->
    <TimeBasedTriggeringPolicy /> 
</Policies

有关详细信息,请参阅https://logging.apache.org/log4j/2.x/manual/appenders.html

jhdbpxl9

jhdbpxl92#

根据文档,MaxFileSize必须是长值。请在https://logging.apache.org/log4j/extras/apidocs/org/apache/log4j/rolling/SizeBasedTriggeringPolicy.html处检查
因此,在本例中,该值应为3072,而不是3kb。

lf5gs5x2

lf5gs5x23#

我只是碰巧遇到了这个问题,我想我应该分享解决方案:
将MaxFileSize参数设置为以字节为单位的值,因此对于您的示例,可以将其设置为

<param name="MaxFileSize" value="3072"/>

Here是一个类似的问题,其中该解决方案得到确认。

83qze16e

83qze16e4#

关于如何指定log4j2的大小的更多细节:

<Policies>
    <SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>

如果检查file size parsing的源代码,则用于分析该值的正则表达式如下:

/**
* Pattern for string parsing.
*/
private static final Pattern VALUE_PATTERN = 
Pattern.compile("([0-9]+([.,][0-9]+)?)\\s*(|K|M|G|T)B?", Pattern.CASE_INSENSITIVE);

我还没有在任何文档中看到这一点,但基本上你可以指定一个数字(那么它将表示总字节数),或者使用KB,MB,GB,TB来指定度量单位。你也可以使用分数,并在数字和单位之间有一个空格。单位是不区分大小写的,所以应该可以指定kb或KB。

相关问题