1

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

由于统计信息将每秒收集一次,我想我需要某种文件处理程序提供的大小限制的日志文件轮换,但我仍然想念的,对我来说重要的是能够在所有日志文件中拥有恒定的标题.

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

有谁知道如何做到这一点?我无法找到适合我的 lib 或其他类似问题。

另外,如果您知道其他一些可以完成此操作的库,我愿意放弃 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";
    }
}

这是工人代码:

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.
4

1 回答 1

2

您必须创建一个自定义 java.util.Formatter并将其安装在您的 FileHandler 上。Formatter.getHead方法用于编写您的标头,并在每次 FileHandler 打开或旋转时调用。在这种情况下,将使用Formatter.format方法为每个给定的 LogRecord 生成一行数据。所以你需要每隔一秒生成(或重用)一个LogRecord,并发布到FileHandler。

于 2016-03-08T19:25:59.803 回答