【问题标题】:Using Logger with a file size limit and number of files limit使用带有文件大小限制和文件数量限制的 Logger
【发布时间】:2020-03-26 13:37:52
【问题描述】:

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

    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”)。如果 Logger 当前正在写入 file.1,我如何确定这一点,因此当我将日志生成为 List 时,日志的顶部是最旧的​​内容(本例中为 file.2)

感谢您的回复。

【问题讨论】:

  • 为什么要从应用程序内部读取日志?这不是为了那个。另外,你应该避免像瘟疫一样的java.util.logging,看看 Logback/SLF4J/Log4J2 和其他现代记录器。
  • 您还可以使用 logrotate 实用程序按大小或日期轮换这些日志,然后阅读它们。
  • 嗨@Kayaman,部分原因是我正在开发一个已建立的代码库,还有其他原因,但基本上它归结为我正在寻找对当前代码库的最简单/最快的更改.
  • @IshankGulati 好主意。我决定编写一个比较器并按上次修改时间排序。

标签: java logging java.util.logging


【解决方案1】:

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

否,但已提交 RFE 以提供此信息。看: How can I output the name of the current java.util.logging.Logger log file name?

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

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

【讨论】:

  • 谢谢。我已经实现了一个解决方案,只是在测试日志文件,只是为了找出你提到的关于旋转的内容。所以我很高兴看到我的预感是正确的。
  • 喜欢你在第一个链接上的答案顺便说一句。不得不这样做有点疯狂,但这是一个很好的解决方案。
【解决方案2】:

好的,我已经制定了一个解决方案,它非常简单,我对此很满意。正如 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

【讨论】:

    猜你喜欢
    • 2022-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2010-10-26
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多