0

我正在与 JUL 合作进行日志记录(不,我无法更改)。我开发了一个简单的包装器,我将参数传递给它,它每次都以正确的格式创建 FileHandler,这样我就不必在每个项目中重新创建日志记录。

我的测试应用程序的功能完全符合预期,但是当我将库导入其他项目时,我似乎遇到了一个(到目前为止只有一个)独特错误:每一次,它都会在日志文件的末尾添加一个“.0” .

即使没有冲突并且文件处理程序已配置为将现有文件附加到末尾(这很好),它也会这样做。我玩过各种文件名,最近我一直在使用简单的“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
4

2 回答 2

0

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

这是用证据还是假设证明的?根据FileHandler文档:

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

如果存在冲突且未指定“%u”字段,则会在文件名末尾添加一个点。(这将在任何自动添加的世代号之后。)

请注意,只有在使用本地磁盘文件系统时才能保证使用唯一 ID 来避免冲突。

冲突可能包括打开多个 FileHandler 到同一位置。您需要验证这些点中的每一个。有帮助的是添加代码来获取RuntimeMXBean,然后添加一条日志语句来记录调用ClassLoader当前线程运行时名称开始时间。运行时名称通常映射到进程 ID 和主机名。运行程序并验证文件的内容。

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

于 2014-06-05T16:59:48.740 回答
0

我最终弄清楚了这一点,忘记了原因。

有两件事在起作用:

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

  2. JUL 在其工作方式上非常不灵活。真的,我不能说得不够糟糕。无论如何,长话短说,如果启用滚动日志记录,它将始终附加一个文件编号,以便活动日志以“.0”结尾。通常,我使用的 API 仅在辅助日志上具有编号,而当前日志将保留您给它的确切名称 - 这给我带来了一些麻烦,因为 JUL没有“获取当前日志文件”方法来获取名称活动文件,所以我需要创建一个丑陋的方法来预测名称应该是什么以参数为基础,希望没有出错。顺便说一句,您无法更改世代编号的格式(这也给我带来了一些问题,因为它更喜欢文件编号为 01、02、... 10、11 而不是 0、1、2、... 10)。

于 2015-04-23T01:32:12.803 回答