带有常量 header 的 Java 旋转日志

标签 java csv logging filehandler log-rotation

我制作了一些系统,现在我想在它运行时跟踪它的一些统计数据。我决定使用 TSV 形式来记下这些统计数据。在寻找现有的最佳库时(如果可以的话,我想避免自己实现它),我发现 FileHandler lib 几乎正是我想要的。

由于每秒都会收集统计信息,我想我需要某种大小限制的日志文件轮换,这是文件处理程序提供的,但我仍然怀念并且对我来说重要的是能够在其中具有恒定的 header 所有日志文件。

所以我想在所有旋转的日志文件中自定义第一行(包含 TSV 格式的列的含义),其余行将是真实的统计数字。

有人知道如何实现这一目标吗?我无法找到适合我的库或其他类似的问题。

此外,如果您知道其他一些可以完成此任务的库,我愿意放弃 FileHandler 而转而使用该库。

提前致谢!

编辑: 因此,根据@jmehrens 提供的答案,我编写了以下代码,它的工作原理就像魅力一样! 这是一个自定义格式化程序类:

class CustomFormatter extends Formatter {
    @Override
    public String format(LogRecord record) {
        return record.getMessage() + "\n";
    }
    @Override
    public String getHead(Handler h) {
        return "header\n";
    }
}

这是 worker 代码:

String path = "/tmp/temp2";
FileHandler fileHandler = new FileHandler(path, 300, 5);
fileHandler.setFormatter(new CustomFormatter());

Logger logger = Logger.getLogger("sam.logging");
logger.addHandler(fileHandler);

for(int i = 0; i < 10000; i++)
    logger.log(new LogRecord(Level.INFO, i+" aaaaaaaaaaaaaa."));

这里是示例输出:

[/tmp] -> cat temp2.3
header
9957 aaaaaaaaaaaaaa.
9958 aaaaaaaaaaaaaa.
9959 aaaaaaaaaaaaaa.
9960 aaaaaaaaaaaaaa.


[/tmp] -> cat temp2.1
header
9985 aaaaaaaaaaaaaa.
9986 aaaaaaaaaaaaaa.
9987 aaaaaaaaaaaaaa.
9988 aaaaaaaaaaaaaa.
9989 aaaaaaaaaaaaaa.

最佳答案

您必须创建一个 custom java.util.Formatterinstall it在你的文件处理程序上。 Formatter.getHead方法用于写入 header ,并在每次打开或旋转 FileHandler 时调用。 Formatter.format在这种情况下,将使用方法为每个给定的 LogRecord 生成一行数据。因此,您需要每秒生成(或重用)一个 LogRecord 和 publish它到 FileHandler。

关于带有常量 header 的 Java 旋转日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35873152/

相关文章:

使用自签名证书的 Java ssl/https 客户端

python - 读取多个 csv 文件(大小 mxm)并加载为 n 维数组(大小 nxmxm)(不连接)

java - Runnable Jar 和 java 的多个版本

java - 如何在没有从java输入xml的情况下执行xsl转换

java - 如何在 ImageIcon 前面移动 JLabel?

windows - 帮助编写批处理脚本来解析 CSV 文件并输出文本文件

Python CSV 到 HTML 表代码不起作用

python - 从 Celery 任务登录到 Sentry

go - 日志repo的抽象实现

python 日志记录和处理程序的使用