2016-08-20 72 views
0

我有一个桌面Java应用程序,我预见到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?,但评论是我可以利用的东西。

回答

6

是的,每个JVM只有一个全局记录器实例。因此,JVM中的所有应用程序将共享相同的全局记录器实例。

如果您想看看它是如何声明的,请参考java.util.Loggersource。它已被宣布为在线218

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

这就是说,你真的不应该使用全局记录器,因为它很容易发生死锁。引用与全局记录器字段相关的Java文档:

不推荐:此字段的初始化容易出现死锁。 字段必须由Logger类初始化进行初始化,这可能会导致LogManager类初始化发生死锁。在这种情况下,两类初始化相互等待完成。从 JDK版本1.6开始,通过调用Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)获取全局记录器对象的首选方法是 。

如果你确实非常认真对待日志(你应该是这样),那么就考虑使用日志记录器设置来声明每个组件的记录器。

相关日志的链接:

Java Logging API Tutorial

Configuring Java Loggers

Good logging practices

0

如果几个应用程序共享相同的JVM(这是桌面应用程序的常见场景,我不认为你真的需要担心这一点),它们将共享相同的引导和系统类加载器,其中包括java.*包(应用程序类可以分开)。

因此,每个JVM只有一个全局记录器实例。