使用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。
答案 0 :(得分:0)
您必须添加有关如何设置FileHandler的更多信息。包含代码和/或logging.properties
文件。
您很可能正在创建多个打开的文件处理程序,并且在创建下一个文件处理程序之前不会关闭前一个文件处理程序。这可能是由于代码中的错误或者您没有对包含FileHandler的记录器进行强引用而发生的。创建此问题的另一种方法是创建两个正在运行的JVM进程。在这种情况下,您别无选择,只能选择文件名中放置唯一编号的位置。
在文件模式中指定%g
令牌和%u
。例如,%gfoo%u.log
。
如果没有"%g"如果已指定字段且文件计数大于1,则生成的数字将添加到生成的文件名的末尾,在点之后。
[剪断]
通常"%u" unique字段设置为0.但是,如果FileHandler尝试打开文件名并发现该文件当前正由另一个进程使用,它将增加唯一编号字段并重试。这将重复进行,直到FileHandler找到当前未使用的文件名。如果发生冲突并且没有"%u"已指定字段,它将在点后面的文件名末尾添加。 (这将在任何自动添加的世代号之后。)
因此,如果三个进程都试图登录到fred%u。%g.txt那么他们最终可能会使用fred0.0.txt,fred1.0.txt,fred2.0.txt作为他们的第一个文件旋转序列。
如果您想从第一个文件中删除零,那么开箱即用行为的最佳近似值就是将您的代码修改为:
LOG_0.log
文件,则使用File.rename将零添加到文件中。这会更改LOG.log
- > LOG_0.log
。LOG_0.log
- > LOG_1.log
等。然后LOG_N.log
- > LOG_0.log
LOG_0.log
- > LOG.log
问题在于,您的代码在单次运行期间不会根据文件大小进行轮换。
答案 1 :(得分:0)
只需使用记录器名称作为文件名(不包括%g)。最新文件将是filename.log。另外请注意,旋转后的文件将以数字作为扩展名。