Java:使用 FileHandler 进行日志记录、旋转

标签 java logging

我使用 FileHandler 进行日志记录。

Logger l = Logger.getLogger ("mylogger");
FileHandler fh = new FileHandler ("log", 1000000, 2, true);
l.addHandler (fh);

这将始终记录到 log.0。如果达到 1MB,它将移至 log.1。 日志记录在空 log.0 处继续。

log.0
log.1

据我所知,数字总是从 0 开始。有没有办法让当前日志中没有数字,并以 1 开始旋转日志?

log  
log.1

最佳答案

简短回答:不使用默认的FileHandler

也就是说,没有什么可以阻止您编写自己的 StreamHandler。 This is OpenJDK's FileHandler implementation 。实际上只需进行几行修改即可实现您想要的行为。

FileHandler 实际上在数组中预先生成所有文件名。您只需调整生成代码,使第一个元素不包含“0”。非常不幸的是,它是一个私有(private)方法,因此您必须重新实现整个类,而不是简单地扩展它。

注意:如果您打算基于 OpenJDK 进行实现,请尊重其分发所依据的许可证。我不是律师,因此您可能需要向其他人询问其合法性使用修改后的 OpenJDK 源。

既然已经解决了,请查看 generate() 方法的内部。有两个地方使用了 Generation 参数,它是日志文件的索引。

} else if (ch2 == 'g') {
    word = word.append(generation); // this line
// ...and...
if (count > 1 && !sawg) {
    word = word.append('.').append(generation); // this line

您希望它们由if(世代> 0)保护

这应该会阻止日志文件显示文件名上的第 0 个索引。

关于Java:使用 FileHandler 进行日志记录、旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53416679/

相关文章:

java - 当屏幕锁定时,Selenium 执行停止

没有 log4net 的 NHibernate?

java - 将多个实例记录到控制台一次 - java.util.logging.Logger

tomcat - ClientAbortException,知其根源

java - 类访问内部类私有(private)?

java - intellij idea,一些断点被标记为既无效又无效

java - 如何使用数组中的值填充 TableView 的列

java - 将 Vaadin 应用程序部署到生产环境时出现问题

java - 保存字段标记为可更新 = false 的实体时,禁用警告 "entity was modified, but it won' t be update because the property is immutable

java - jvm优化可以改变指令顺序吗?