Java记录全局记录器

时间:2016-08-20 05:49:46

标签: java logging

我有一个桌面java应用程序,我预见到Java日志记录就足够了。为了简化这个问题,我使用java全局记录器来获取记录器而不是传递任何特定的记录器名称

        Logger logger = Logger.getGlobal();
        String logFilePath = Config.INSTANCE.getProperty("logFilePath");
        FileHandler fileHandler = new FileHandler(logFilePath);
        logger.addHandler(fileHandler);
        SimpleFormatter formatter = new SimpleFormatter();
        fileHandler.setFormatter(formatter);

如上所示,我还在输出文件路径和格式化程序方面对全局记录器进行了更改。

我的问题是关于全局记录器的范围,它的全局范围是JVM吗?或全局范围的应用程序?如果全局范围在JVM上,我是否应该对共享相同JVM的应用程序产生副作用? 小费: 我已经完成了这个帖子In java.util.logging, what is the global logger for?,但评论不是我可以使用的。

2 个答案:

答案 0 :(得分:6)

是的,每个JVM只有一个Global Logger实例。因此,JVM中的所有应用程序将共享相同的Global Logger实例。

如果您希望了解它是如何声明的,请参阅java.util.Logger的{​​{3}}。它已在第218行声明如下

    @Deprecated
218 public static final Logger global = new Logger(GLOBAL_LOGGER_NAME);

那说你真的不应该使用Global Logger,因为它容易出现死锁。引用与全局记录器字段相关的Java文档:

  

不推荐使用:此字段的初始化容易出现死锁。该   字段必须由Logger类初始化初始化,这可能是   使用LogManager类初始化导致死锁。在这样的   case两类初始化等待彼此完成。作为   JDK 1.6版,获取全局记录器对象的首选方法是   通过调用Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)。

如果你真的非常认真考虑(你应该这样做),那么考虑为每个组件声明记录器,这些记录器可以使用记录器设置以粒度方式进行控制。

与日志记录相关的其他链接:

source

Java Logging API Tutorial

Configuring Java Loggers

答案 1 :(得分:0)

如果多个应用程序共享相同的JVM(这是桌面应用程序的常见方案,我认为你真的不需要关心它),它们将共享相同的引导和系统类加载器,其中包括{{ 1}}包(应用程序类可以分开)。

因此,每个JVM只有一个全局Logger实例。