程序化Java日志记录问题

时间:2019-03-03 19:38:06

标签: java.util.logging

我们有一个本地实用程序,用于在使用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上运行(是的,我知道。我们今年将进行升级)。

我应该有更好的方法吗?由于它似乎在一种环境中可以很好地工作,因此我认为这种方法很好。

谢谢!

1 个答案:

答案 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与磁盘同步?