Java FileHandler将不必要的数字添加到文件名

时间:2014-06-04 22:28:26

标签: java logging path filehandler

我正在使用JUL进行日志记录(不,我不能改变它)。我已经开发了一个简单的包装器,我在参数中传递它,并且每次都使用正确的格式创建FileHandler,这样我就不必在每个项目中重新创建日志记录。

我的测试应用程序完全按照预期运行,但是当我将库导入其他项目时,我似乎得到一个(目前只有一个)唯一错误:每次都会在结尾处添加“.0”日志文件。

即使没有冲突并且Filehandler已经配置为追加到现有文件(它没有问题),它也会这样做。我玩过各种文件名,最近我一直使用简单的“mylog.log”,日志文件仍然输出为“mylog.log.0”。我已经检查过fileHandler正在传递正确的文件(“mylog.log”),但它没有在那里登录。

这不会发生在我的日志测试中,只发生在我实际想要使用它的项目中。即使使用完全相同的参数,我也会得到不同的文件名。

我是否遗漏了一些关于JUL的怪癖?代码很简单。相关代码:

String logFilePath = directory+name; // directory and name are method arguments
Handler newFileHandler;
File dirFile = new File(directory);
if(!dirFile.exists())
{
    dirFile.mkdirs();
}
newFileHandler = new FileHandler(logFilePath, true);
newFileHandler.setFormatter(myformatter);
//... etc

2 个答案:

答案 0 :(得分:0)

  

即使没有冲突,它也会这样做....

这是证据还是假设?根据{{​​3}}文档:

  

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

     

如果发生冲突且没有"%u"已指定字段,它将在点后面的文件名末尾添加。 (这将在任何自动添加的世代号之后。)

     

请注意,使用唯一ID以避免冲突只能保证在使用本地磁盘文件系统时可靠地工作。

冲突可能包括将多个FileHandler打开到同一位置。您需要验证每个点。有助于添加代码以获取FileHandler,然后添加单个日志语句来记录调用RuntimeMXBeanClassLoadercurrent threadruntime name。运行时名称通常映射到进程ID和主机名。运行程序并验证文件的内容。

您所包含的代码有帮助,但您需要包含有关如何启动应用程序以及logging.properties中包含的内容的详细信息。

答案 1 :(得分:0)

我最终想出了这个并忘了发布原因。

有两件事在起作用:

  1. 由于我所处的环境,“滚动”记录由一些我不知道的背景变量激活,因此为什么在不应该添加“.0”时添加曾经,但是一旦我把它从测试中移出并进入实际的实施项目,我才看到它。

  2. JUL的工作原理非常灵活。真的,我说的不够好。无论如何,简而言之,如果启用了滚动日志记录,它将始终附加一个文件号,使活动日志以“.0”结尾。通常我使用的API只包含辅助日志上的数字,而当前日志会保留你给它的确切名称 - 这导致我遇到麻烦,因为JUL 没有“获取当前日志文件“获取活动文件名称的方法,所以我需要创建一个丑陋的方法,根据参数预测应该的名称,并希望没有出错。顺便说一句,你不能改变世代号的格式(这也引起了一些问题,因为它首选的文件号为01,02,... 10,11而不是0,1,2,...... 10)。