Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何自定义java日志文件,使其最多只包含N条日志记录,而不是以字节为单位的大小_Java_Log4j_Java.util.logging - Fatal编程技术网

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

如何自定义java日志文件,使其最多只包含N条日志记录,而不是以字节为单位的大小,java,log4j,java.util.logging,Java,Log4j,Java.util.logging,我正在使用生成日志文件。它使用文件处理程序将记录写入日志文件。 FileHandler类包含limit参数,用于在当前日志文件的大小(以字节为单位)超过限制时决定何时创建新文件 是否有任何方法可以覆盖将文件处理程序限制为其他参数而不是大小的行为?like—每个日志文件中的最大N个记录数。如果出现第(N+1)条记录,将生成一个新的文件日志文件。 如果无法使用标准java.logging实现,是否有其他开源实现此行为(如log4j或任何其他开源记录器)?可以通过覆盖setLevel方法扩展FileH

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

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

可以通过覆盖
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();
    }
}
导入java.io.File;
导入java.io.IOException;
导入java.util.logging.FileHandler;
导入java.util.logging.Level;
导入java.util.logging.LogRecord;
导入java.util.logging.SimpleFormatter;
公共类CountingFileHandler扩展FileHandler{
私有静态最终运行时异常阻止_ROTATE=new RuntimeException();
私人最终长期记录;
私人长计数;
public CountingFileHandler(字符串模式、长maxRecords、int文件)引发IOException{
超级(模式,1,文件,错误);
this.maxRecords=maxRecords;
}
@凌驾
公共同步无效设置级别(级别lvl){
如果(Level.OFF.equals(lvl)){//旋转将级别设置为关闭。
如果(++计数<最大记录数){
投掷防止旋转;
}
计数=0升;
}
超级设置级别(lvl);
}
@凌驾
公共同步作废发布(日志记录){
试一试{
超级。出版(记录);
}捕获(运行时异常re){
如果(re!=防止旋转){
投掷re;
}
}
}
公共静态void main(字符串[]args)引发异常{
System.out.println(新文件(“.”.getCanonicalPath());
CountingFileHandler cfh=新的CountingFileHandler(“测试%g.log”,2,5);
setFormatter(新的SimpleFormatter());
对于(int i=0;i<10;i++){
发布(新日志记录(Level.SEVERE,Integer.toString(i));
}
cfh.close();
}
}

否则,如果您只想为单个日志文件设置一些最大限制,则只需安装
Long.max\u VALUE
。该过滤器包含在中。此解决方案无法提供您想要的旋转。

谢谢,这正是我想要的。