使用带有来自java.util.logging的FileHandler的logger时,不需要.0扩展日志文件

时间:2017-10-25 02:56:04

标签: java logging java.util.logging

使用Java.util.logging< FileHandler类创建循环日志。但是为什么这些日志附加了.0扩展名。 .1,.2,.3等都没问题,我只需要.0作为我的文件扩展名,因为它对客户来说很困惑。有没有办法实现同样的目标? 我使用的是java版本的java版本" 1.8.0_144"。

FileHandler fileTxt = new FileHandler(pathOfLogFile+"_%g.log",
                Integer.parseInt(prop.getProperty("MAX_LOG_FILE_SIZE")),
                Integer.parseInt(prop.getProperty("NO_OF_LOG_FILES")), true);
SimpleFormatter formatterTxt = new SimpleFormatter();
        fileTxt.setFormatter(formatterTxt);
        logger.addHandler(fileTxt);

日志文件的名称是LOG_0.log。要求是不要在最新文件上有_0,需要简单的LOG.log。

2 个答案:

答案 0 :(得分:0)

您必须添加有关如何设置FileHandler的更多信息。包含代码和/或logging.properties文件。

您很可能正在创建多个打开的文件处理程序,并且在创建下一个文件处理程序之前不会关闭前一个文件处理程序。这可能是由于代码中的错误或者您没有对包含FileHandler的记录器进行强引用而发生的。创建此问题的另一种方法是创建两个正在运行的JVM进程。在这种情况下,您别无选择,只能选择文件名中放置唯一编号的位置。

在文件模式中指定%g令牌和%u。例如,%gfoo%u.log

根据FileHandler documentation

  

如果没有"%g"如果已指定字段且文件计数大于1,则生成的数字将添加到生成的文件名的末尾,在点之后。

     

[剪断]

     

通常"%u" unique字段设置为0.但是,如果FileHandler尝试打开文件名并发现该文件当前正由另一个进程使用,它将增加唯一编号字段并重试。这将重复进行,直到FileHandler找到当前未使用的文件名。如果发生冲突并且没有"%u"已指定字段,它将在点后面的文件名末尾添加。 (这将在任何自动添加的世代号之后。)

     

因此,如果三个进程都试图登录到fred%u。%g.txt那么他们最终可能会使用fred0.0.txt,fred1.0.txt,fred2.0.txt作为他们的第一个文件旋转序列。

如果您想从第一个文件中删除零,那么开箱即用行为的最佳近似值就是将您的代码修改为:

  1. 如果不存在LOG_0.log文件,则使用File.rename将零添加到文件中。这会更改LOG.log - > LOG_0.log
  2. Trigger a rotation。结果LOG_0.log - > LOG_1.log等。然后LOG_N.log - > LOG_0.log
  3. 使用File.rename从文件中删除零。 LOG_0.log - > LOG.log
  4. 打开文件处理程序,将日志数作为一个而不添加。这将擦除最旧的日志文件并启动新的当前日志文件。
  5. 问题在于,您的代码在单次运行期间不会根据文件大小进行轮换。

答案 1 :(得分:0)

只需使用记录器名称作为文件名(不包括%g)。最新文件将是filename.log。另外请注意,旋转后的文件将以数字作为扩展名。