如何自定义java日志文件,最多只包含N个日志记录,而不是以字节为单位的大小

时间:2017-12-16 11:17:19

标签: java log4j java.util.logging

我正在使用java.util.logging生成日志文件。它使用 FileHandler 将写入记录写入日志文件。 FileHandler类包含limit参数,用于决定何时创建新文件,以防当前日志文件的大小(以字节为单位)超出限制。

我们有什么方法可以覆盖将文件处理程序限制为其他参数而不是大小的行为? like - 每个日志文件中的最大N个记录数。如果有第(N + 1)条记录,则生成新的文件日志文件。 如果使用标准java.logging无法实现,是否还有其他开源实现此行为(如log4j或任何其他开源记录器)?

1 个答案:

答案 0 :(得分:1)

可以通过覆盖setLevel方法扩展FileHandler以监听轮换。然后通过将限制设置为一个字节来强制FileHandler始终旋转,然后在不满足条件时阻止旋转发生。

以下是一个示例解决方案:

import java.io.File;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.SimpleFormatter;


public class CountingFileHandler extends FileHandler {

    private static final RuntimeException PREVENT_ROTATE = new RuntimeException();
    private final long maxRecords;
    private long count;

    public CountingFileHandler(String pattern, long maxRecords, int files) throws IOException {
        super(pattern, 1, files, false);
        this.maxRecords = maxRecords;
    }

    @Override
    public synchronized void setLevel(Level lvl) {
        if (Level.OFF.equals(lvl)) { //Rotation sets the level to OFF.
            if (++count < maxRecords) {
                throw PREVENT_ROTATE;
            }
            count = 0L;
        }
        super.setLevel(lvl);
    }

    @Override
    public synchronized void publish(LogRecord record) {
        try {
            super.publish(record);
        } catch (RuntimeException re) {
            if (re != PREVENT_ROTATE) {
                throw re;
            }
        }
    }

    public static void main(String[] args) throws Exception {
        System.out.println(new File(".").getCanonicalPath());
        CountingFileHandler cfh = new CountingFileHandler("test%g.log", 2, 5);
        cfh.setFormatter(new SimpleFormatter());
        for (int i = 0; i < 10; i++) {
            cfh.publish(new LogRecord(Level.SEVERE, Integer.toString(i)));
        }
        cfh.close();
    }
}

否则,如果您只想为单个日志文件设置一些最大限制,则只需安装com.sun.mail.util.logging.DurationFilter,其持续时间为Long.MAX_VALUE。该过滤器包含在javax.mail.jar or the logging-mailhandler.jar中。这个解决方案不会提供你想要的旋转。