如何在 Log4j 中将 SizeBasedTriggeringPolicy 与 TimeBasedRollingPolicy 结合使用?

问题描述 投票:0回答:5

嗨,我正在使用 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". 

我该如何解决这个问题。请帮助我。

java log4j rollingfileappender
5个回答
5
投票

如果您使用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 了解更多详细信息。


5
投票

根据文档,MaxFileSize 必须是长值。请查看 https://logging.apache.org/log4j/extras/apidocs/org/apache/log4j/rolling/SizeBasedTriggeringPolicy.html

因此,在本例中该值应为 3072,而不是 3kb。


0
投票

刚好遇到这个问题,我想我应该分享解决方案:

将 MaxFileSize 参数设置为以字节为单位的值,因此对于您的示例,您可以将其设置为

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

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


0
投票

有关如何指定 log4j2 大小的更多详细信息:

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

如果查看文件大小解析的源代码,用于解析该值的正则表达式如下:

/**
* 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。


0
投票

除非您将“%i”添加到 FileNamePattern,否则基于大小的触发器将不起作用。否则,文件名不会更改,因此基于大小的触发器不会导致滚动。

(除了已经提到的 MaxFileSize 是一个没有单位的长“字节”值)

一个很好的来源:https://www.baeldung.com/java-logging-rolling-file-appenders#5-rolling-based-on-size-and-time

© www.soinside.com 2019 - 2024. All rights reserved.