按大小和时间滚动日志

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

我使用

RollingFileAppender
log4j 1.2.16
,当日志文件达到一定大小时,它会滚动日志文件。现在我想每天滚动日志文件并且当它们达到一定大小时。因此每天会有一个或多个日志文件。

例如,

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

是否有现成的附加程序,它已经可以实现了?

java log4j appender rollingfileappender
4个回答
8
投票

确实有两个选择:

  1. 使用 LogBack 及其大小和时间触发策略:http://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedFNATP
  2. 这里有 Log4J 的 TimeAndSizeRollingAppender:http://www.simonsite.org.uk/

请记住,这两个选项都使用文件重命名。如果有另一个脚本自动移动这些文件,请仔细考虑这一点。当两个进程处理同一个文件时,文件重命名是有风险的。

我的建议是直接以以下模式写入不可变日志文件名:myapp-{dd.MM.yyyy}.{X}.log。这样,“滚动”只是关闭一个文件并打开一个新文件。没有重命名。没有后台线程。


4
投票

快速回答是“不”。查看 log4j 的 javadoc:https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/FileAppender.html

只有两个开箱即用的文件附加器:DailyRollingFileAppender 和 RollingFileAppender(不推荐第一个,因为它存在同步问题)。

为了实现你想要的,你应该创建自己的appender,扩展RollingFileAppender并修改它以在日期改变时滚动文件。修改将在方法中:

 protected void subAppend(LoggingEvent event)

您可以在此处查看其来源:http://www.docjar.com/html/api/org/apache/log4j/RollingFileAppender.java.html(第274行)。

您只需复制并粘贴代码并更改 if 调用 rollOver 以满足您的需求。


3
投票

下面的配置 xml 将完成这项工作: 所需 JAR: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>

0
投票

Log4j2 和 logback 是更好的选择,但如果你想要 log4j-v1:

Log4j-v1-extras 有它:(org.apache.log4j.rolling.RollingFileAppender)

<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 作业来做到这一点。如果您不想要 cron 作业但想要删除,我建议使用 log4j-v1 基于基本大小的 RollingFileAppender 或 log4j-extras SizeBasedTriggeringPolicy (请参阅 baeldung 文章示例)。

注意:FileNamePattern 中的“%i”对于时间和大小来说是必需的。它向所有备份的日志文件名添加一个大的长整型(刻度?)。这与 logback 不同,logback 中“%i”变为 0,1,2,..

Log4j-extras 依赖项:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>apache-log4j-extras</artifactId>
    <version>1.2.17</version>
</dependency>
© www.soinside.com 2019 - 2024. All rights reserved.