Java 以常量 header 旋转日志
Java rotating logs with constant header
我做了一些系统,现在我想在它 运行 的时候跟踪一些关于它的统计数据。我决定使用 TSV 表格来记下这些统计数据。在寻找最好的现有库时(如果可以的话,我想避免自己实现它)我发现 FileHandler 库几乎正是我想要的。
由于每秒都会收集统计信息,我想我需要某种文件处理程序提供的大小限制的日志文件轮换,但我仍然想念的是对我来说重要的是能够保持不变header 在所有日志文件中。
所以我想在所有日志文件中旋转自定义第一行(包含 TSV 格式的列的含义),其余行将是真实的统计数字。
有谁知道如何做到这一点?我找不到适合我的库或其他类似问题。
此外,如果您知道其他一些可以完成此操作的库,我愿意放弃 FileHandler 以支持那个库。
提前致谢!
编辑:
因此,根据@jmehrens 提供的答案,我编写了以下代码,并且效果很好!
这是一个自定义格式化程序 class:
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.
您必须为 FileHandler 创建一个 custom java.util.Formatter and install it on your FileHandler. The Formatter.getHead method is used to write your headers and is called every time the FileHandler is open or rotates. The Formatter.format method would be used in this case to generate one row of data per given LogRecord. So you need to generate (or reuse) one LogRecord every one second and publish 它。
我做了一些系统,现在我想在它 运行 的时候跟踪一些关于它的统计数据。我决定使用 TSV 表格来记下这些统计数据。在寻找最好的现有库时(如果可以的话,我想避免自己实现它)我发现 FileHandler 库几乎正是我想要的。
由于每秒都会收集统计信息,我想我需要某种文件处理程序提供的大小限制的日志文件轮换,但我仍然想念的是对我来说重要的是能够保持不变header 在所有日志文件中。
所以我想在所有日志文件中旋转自定义第一行(包含 TSV 格式的列的含义),其余行将是真实的统计数字。
有谁知道如何做到这一点?我找不到适合我的库或其他类似问题。
此外,如果您知道其他一些可以完成此操作的库,我愿意放弃 FileHandler 以支持那个库。
提前致谢!
编辑: 因此,根据@jmehrens 提供的答案,我编写了以下代码,并且效果很好! 这是一个自定义格式化程序 class:
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.
您必须为 FileHandler 创建一个 custom java.util.Formatter and install it on your FileHandler. The Formatter.getHead method is used to write your headers and is called every time the FileHandler is open or rotates. The Formatter.format method would be used in this case to generate one row of data per given LogRecord. So you need to generate (or reuse) one LogRecord every one second and publish 它。