我们有一个本地实用程序,用于在使用java.util.logging的产品之间进行集成。我们有一个XML配置文件,实用程序可以读取该XML配置文件,并在启动时以编程方式设置日志记录(xml也对该实用程序具有其他配置)。运行时,如果用户更改了日志记录级别,则WatchService会检测到它并设置该级别。这是执行日志记录的代码:
Level level = Level.parse(logConfig.getLogOutput().getLogOutputLevel());
if(!isLoggingInitialized)
{
int maxSize = fileLog.getMaxFileSize() * 1000000;
Logger maneClient = Logger.getLogger("com.raytheon.mane.client");
String path = fileLog.getLogFileOutputPath();
File f = new File(path);
if(!Files.exists(f.toPath().getParent()))
{
try
{
Files.createDirectories(f.toPath().getParent());
}
catch(IOException ioe)
{
throw new MANEClientException("Unable to create logging directory: " + ioe.getMessage(), ioe);
}
}
FileHandler fileHander = new FileHandler(fileLog.getLogFileOutputPath(), maxSize, fileLog.getMaxBackupIndex().intValue(), true);
fileHander.setFormatter(new SimpleFormatter());
fileHander.setLevel(level);
maneClient.addHandler(fileHander);
maneClient.setUseParentHandlers(false);
isLoggingInitialized = true;
}
else
{
Logger maneClient = Logger.getLogger("com.raytheon.mane.client");
Arrays.asList(maneClient.getHandlers()).forEach(h -> h.setLevel(level));
}
(我们使用JAXB,我没有包含那些对象的解析)
在我们的开发环境中,此日志记录按预期工作。如果我以Level.OFF启动应用程序,则会创建日志文件(包括.lck),但不会写入任何内容。一旦将xml配置更改为FINE,就得到了预期的日志记录。太好了。
但是,在我们的测试实验室中,如果我设置Level.OFF并随后对其进行更改,则直到我们停止运行该应用程序的服务之前,才会发生日志记录,此时似乎所有应该发生的日志记录都已刷新到该文件。
如果我使用Level.FINE启动该应用程序,它将记录日志,然后切换到Level.OFF,日志记录将停止,但是如果我切换回Level.FINE或Level.INFO,则直到停止服务后才会进行日志记录。
我可以看到的环境之间的唯一区别是操作系统。开发环境在带有Win 7 Prof的Open JDK 11上运行。测试环境中的服务器在带有Win Server 8的Open JDK 11上运行(是的,我知道。我们今年将进行升级)。
我应该有更好的方法吗?由于它似乎在一种环境中可以很好地工作,因此我认为这种方法很好。
谢谢!
答案 0 :(得分:0)
如果我以Level.OFF启动应用程序,则会创建日志文件(包括.lck),但不会写入任何内容。
.lck和日志文件是在构造FileHandler时创建的。如果您不希望这些文件,则在级别为OFF时不要创建FileHandler。
如果我使用Level.FINE启动应用程序,它将记录日志,然后切换到Level.OFF,日志记录将停止,但是如果我切换回Level.FINE或Level.INFO,则直到停止服务后才会进行日志记录。 / p>
确保您对“ com.raytheon.mane.client”记录器有很强的引用。在您的代码中,您仅使用方法本地引用。您需要至少一个静态最终引用该记录器到prevent garbage collection。
也Windows will delay writing bytes to the disk (sync vs. flush)。您描述的行为与FileHandler.close匹配将在关机时执行同步。当前,使FileHandler执行同步的唯一方法是将其关闭或旋转。也许您只是没有将足够的数据写入日志以使Windows与磁盘同步?