Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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 使用具有文件大小限制和文件数限制的记录器_Java_Logging_Java.util.logging - Fatal编程技术网

Java 使用具有文件大小限制和文件数限制的记录器

Java 使用具有文件大小限制和文件数限制的记录器,java,logging,java.util.logging,Java,Logging,Java.util.logging,我想知道是否有人能帮我解决这个问题。 我当前的代码是设置好的,为了使用java.util.logging中的记录器,我们将日志写入一个文件,当我们需要访问日志时,我们只读取该文件 String filename = name + ".log"; Logger logger = Logger.getLogger(name); logger.setLevel(Level.ALL); final FileHandler fileHandler = new FileHan

我想知道是否有人能帮我解决这个问题。 我当前的代码是设置好的,为了使用java.util.logging中的记录器,我们将日志写入一个文件,当我们需要访问日志时,我们只读取该文件

    String filename = name + ".log";
    Logger logger = Logger.getLogger(name);
    logger.setLevel(Level.ALL);
    final FileHandler fileHandler = new FileHandler(filename, true);
    final SimpleFormatter formatter = new LogFormatter();
    fileHandler.setFormatter(formatter);
    logger.addHandler(fileHandler);
然后通过以下方式获取日志内容:

    Files.readAllLines(Paths.get(filename));
出现了一个问题,文件大小可能变得太大,因此我想限制它。通过阅读文档,我可以做到以下几点

    final FileHandler fileHandler = new FileHandler(filename, 1000000, 3, true);
这将创建多达三个1MB的文件,在第三个文件被填充时循环,清除第一个文件并再次从那里写入。 这是一个完美的解决方案,但有两个问题我不确定如何解决

首先,有没有一种简单的方法可以找到所有创建文件的名称?(更准确地说,有没有一种简单的方法可以做到这一点?我很感激我可以只查找filename.0,filename.1…达到极限)

其次,我如何找到哪个是“活动”文件。 例子。假设一个周期已经完成,有三个文件(“file.0”、“file.1”、“file.2”)。如果记录器当前正在写入文件.1,我如何确定这一点,因此当我生成日志as列表时,日志顶部是最早的内容(本例中为文件.2)

谢谢你的回复

首先,有没有一种简单的方法可以找到所有创建文件的名称?(更准确地说,有没有一种简单的方法可以做到这一点?我很感激我可以只查找filename.0,filename.1…达到极限)

没有,但已提交RFE以提供此信息。见:

其次,我如何找到哪个是“活动”文件。例子。假设一个周期已经完成,有三个文件(“file.0”、“file.1”、“file.2”)。如果记录器当前正在写入文件.1,我如何确定这一点,因此当我生成日志as列表时,日志顶部是最早的内容(本例中为文件.2)


根据,日志文件向下旋转,并从末尾删除。因此,位置0始终是活动文件。

好的,我已经找到了一个解决方案,它非常简单,我对它非常满意。正如jmehrens提到的,没有直接的方法,但我想我会把它贴在这里,以防其他人也有同样的问题

String filename = name + ".log";
// To make life easy create a directory to output logs into
final File directory = new File("log");
directory.mkdir();

// Create a java.io.FileFilter object to filter only the files I am looking for 
// ignoring the locked file (this answers my first question)
FileFilter filter = (pathname) -> {
        final String name = pathname.getName();
        return name.contains(filename) && !name.endsWith(".lck");
    };

// Uses the filter to find all files in the directory associated with 
// the log and deletes them
Arrays.asList(directory.listFiles(filter)).forEach(file -> file.delete());

// Create logger as before 
logger = Logger.getLogger(name);
logger.setLevel(Level.ALL);
final FileHandler fileHandler = new FileHandler("log/" + filename, limit, 
numberOfFiles, true);
final SimpleFormatter formatter = new LogFormatter();
fileHandler.setFormatter(formatter);
logger.addHandler(fileHandler);
然后,只需在先前确定的目录上使用相同的过滤器即可获得日志的输出。按上次修改的日期排序,然后读取所有行

final List<File> logFiles = Arrays.asList(directory.listFiles(filter));
logFiles.sort((file0, file1) -> {
    final Long date1 = file0.lastModified();
    final Long date2 = file1.lastModified();
    return date1.compareTo(date2);
});
// Iterate through logFiles and read the lines
final List logFiles=Arrays.asList(directory.listFiles(filter));
logFiles.sort((文件0,文件1)->{
final Long date1=file0.lastModified();
final Long date2=file1.lastModified();
返回日期1.与(日期2)相比;
});
//遍历日志文件并读取行

为什么要从应用程序内部读取日志?这不是为了那个。此外,您应该避免像瘟疫一样使用
java.util.logging
,查看Logback/SLF4J/Log4J2和其他现代记录器。您也可以使用logrotate实用程序按大小或日期旋转这些日志,然后读取它们。Hi@Kayaman部分原因是因为我正在使用已建立的代码库,还有其他原因,但基本上,它可以归结为我正在寻找对当前代码库的最简单/最快速的更改。@Ishangulati好主意。我决定写一个比较器并按上次修改的时间排序。谢谢。我已经实现了一个解决方案,并且正在测试日志文件,只是为了了解您提到的关于rotate的内容。所以我很高兴看到我的直觉是正确的。顺便说一句,我喜欢你在第一个链接上的答案。必须这样做有点疯狂,但这是一个很好的解决方案。