繁体   English   中英

将logger与java.util.logging中的FileHandler一起使用时,不需要.0扩展日志文件

[英]Do not need .0 extension log file when using logger with FileHandler from 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。

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

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

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

根据FileHandler文档

如果未指定“%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. 触发旋转 结果在LOG_0.log > LOG_1.log等中。然后在LOG_N.log > LOG_0.log
  3. 使用File.rename从文件中删除零。 LOG_0.log > LOG.log
  4. 打开您的文件处理程序,日志数量为一个,没有附加日志。 这将擦除最早的日志文件并开始新的当前日志文件。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM