log4j 按大小和时间滚动日志

r1wp621o  于 2023-10-18  发布在  其他
关注(0)|答案(4)|浏览(129)

我使用log4j 1.2.16RollingFileAppender,它在日志文件达到一定大小时滚动日志文件。现在,我想每天滚动日志文件,当它们达到一定大小时。因此,每天将有一个或多个日志文件。
比如说,

myapp.log
myapp-17.12.2013.log
myapp-16.12.2012.log
myapp-16.12.2012.1.log
myapp-16.12.2012.2.log

有没有现成的appender,它已经这样做了?

fae0ux8s

fae0ux8s1#

实际上有两种选择:
1.使用LogBack及其大小和时间触发策略:http://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedFNATP
1.这里有Log4J的TimeAndSizeRollingRollingRollingder:http://www.simonsite.org.uk/
请记住,这两个选项都使用文件重命名。如果有另一个脚本自动移动这些文件,请仔细考虑这一点。当两个进程处理同一个文件时,文件重命名是有风险的。
我的建议是在模式中直接写入不可变的日志文件名:myapp-{dd.MM.yyyy}.{X}. log.这样,“滚动”就是简单地关闭一个文件并打开一个新文件。没有名字。没有后台线程。

zpjtge22

zpjtge222#

答案是否定的。看看log4j的javadoc:https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/FileAppender.html
只有两个开箱即用的文件附加器:DailyRollingFilesander和RollingFilesander(不推荐使用第一个,因为它存在同步问题)。
要实现您想要的功能,您应该创建自己的appender,扩展RollingFileAppender并修改它,以便在日期发生变化时滚动文件。修改将在方法中:

protected void subAppend(LoggingEvent event)

你可以在这里看到它的来源:http://www.docjar.com/html/api/org/apache/log4j/RollingFileAppender.java.html(第274行)。
您只需要复制并粘贴代码,并更改if调用rollOver以满足您的需要。

qgelzfjb

qgelzfjb3#

下面的配置xml将完成这项工作:所需时间:Log4j-rolling-appender-20150607-2059

<?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="file"
        class="uk.org.simonsite.log4j.appender.TimeAndSizeRollingAppender">
        <param name="File" value="D:\\App.log" />
        <param name="Threshold" value="DEBUG" />
        <param name="DatePattern" value=".yyyy-MM-dd" />
        <param name="MaxFileSize" value="1KB" />
        <param name="MaxRollFileCount" value="100" />
        <param name="ScavengeInterval" value="30000" />
        <param name="BufferedIO" value="false" />
        <param name="CompressionAlgorithm" value="GZ" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %-23d{ISO8601} [%t] %x: %c{1} - %m%n" />
        </layout>
    </appender>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="file" />
    </root>

</log4j:configuration>
gijlo24d

gijlo24d4#

log4j 2和logback是更好的,但如果你想要log4j-v1:
Log4j-v1-extras有它:(org.apache.log4j.rolling.RollingFileToolder)

<appender name="roll-by-time-and-size" class="org.apache.log4j.rolling.RollingFileAppender">
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
        <param name="ActiveFileName" value="log4j/roll-by-time-and-size/app.log" />
        <param name="FileNamePattern" value="log4j/roll-by-time-and-size/app.%d{HH-mm}.%i.log.gz" />
    </rollingPolicy>
    <triggeringPolicy
        class="org.apache.log4j.rolling.SizeBasedTriggeringPolicy">
        <param name="MaxFileSize" value="100" />
    </triggeringPolicy>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n" />
    </layout>
</appender>

来源:https://www.baeldung.com/java-logging-rolling-file-appenders#5-rolling-based-on-size-and-time
注意:X天后没有旧文件删除。一个cron job可以用来做这件事。如果你不想要一个cron作业,但想要删除,我建议使用log4j-v1 basic size-based RollingFileTriggerder或log4j-extras SizeBasedTriggeringPolicy(参见baeldung文章示例)。
注意:FileNamePattern中的“%i”是time + size都工作所必需的。它添加了一个大的long-int(ticks?)到所有备份的日志文件名。这与logback不同,logback中“%i”变为0,1,2,.
Log4j-extras依赖:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>apache-log4j-extras</artifactId>
    <version>1.2.17</version>
</dependency>

相关问题