我有一个桌面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?,但评论不是我可以使用的。
答案 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)。
如果你真的非常认真考虑(你应该这样做),那么考虑为每个组件声明记录器,这些记录器可以使用记录器设置以粒度方式进行控制。
与日志记录相关的其他链接:
答案 1 :(得分:0)
如果多个应用程序共享相同的JVM(这是桌面应用程序的常见方案,我认为你真的不需要关心它),它们将共享相同的引导和系统类加载器,其中包括{{ 1}}包(应用程序类可以分开)。
因此,每个JVM只有一个全局Logger实例。