使用具有文件大小限制和文件数量限制的 Logger

Using Logger with a file size limit and number of files limit

我想知道是否有人可以帮助我解决这个问题。 我当前的代码已设置,要在 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 ... 直到极限)。

其次,我如何找到 "active" 文件。 例子。假设一个周期已经完成并且有三个文件("file.0"、"file.1"、"file.2")。如果 Logger 当前正在写入 file.1,我如何确定这一点,因此当我将日志生成为 List 时,日志的顶部是最旧的​​内容(本例中为 file.2)

感谢您的任何回复。

Firstly is there an easy way to find the name of all the files created? (More precisely is there an easy way to do this? I appreciate I can just look for filename.0, filename.1 ... up to the limit).

否,但已提交 RFE 以提供此信息。看: 如何输出当前java.util.logging.Logger日志文件名的名称?

Secondly how do I find which is the "active" file. Example. Lets say that one cycle has already been completed and there are three files ("file.0", "file.1", "file.2"). If the Logger is currently writing to file.1, how do I determine this, so therefore when I produce the log as List the top of the log is the oldest content (file.2 in this example)

根据source code for FileHandler::rotate,日志文件向下循环,从末尾开始丢弃。因此位置零始终是活动文件。

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

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