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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何自定义java日志文件,最多只包含N个日志记录,而不是以字节为单位的大小相关的知识,希望对你有一定的参考价值。

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

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

答案

可以扩展FileHandler以通过覆盖setLevel方法来监听旋转。然后通过将限制设置为一个字节来强制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.DurationFilterLong.MAX_VALUE。该过滤器包含在javax.mail.jar or the logging-mailhandler.jar中。此解决方案不会提供您想要的旋转。

以上是关于如何自定义java日志文件,最多只包含N个日志记录,而不是以字节为单位的大小的主要内容,如果未能解决你的问题,请参考以下文章

Python 自定义日志记录处理程序,用于为字典中的每个键创建每个日志文件

日志技术-Java原生日志实现JUL

C#ConcurrentBag - 如何安全地清除每个添加的N个对象

Worklight 自定义记录器

Spring中如何通过自定义用户事件管理日志文件切换?

Java日志框架 -- LOG4J(Log4j入门案例日志级别Log4j组件(LoggersAppendersLayouts)配置文件内置日志记录自定义Logger)