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

问题描述 投票:0回答:2

使用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。

java logging java.util.logging
2个回答
0
投票

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

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

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

根据FileHandler documentation

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

[剪断]

通常,“%u”唯一字段设置为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. 打开文件处理程序,将日志数作为一个而不添加。这将擦除最旧的日志文件并启动新的当前日志文件。

这样做的问题是,在单次运行期间,您的代码不会根据文件大小进行旋转。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.