我有一个桌面 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?但是评论不是我可以利用的。
最佳答案
是的,每个 JVM 只有一个 Global Logger 实例。因此,JVM 中的所有应用程序将共享同一个 Global Logger 实例。
引用source java.util.Logger
如果您想了解它是如何声明的。它已在第 218 行声明如下
@Deprecated
218 public static final Logger global = new Logger(GLOBAL_LOGGER_NAME);
那就是说您真的不应该使用全局记录器,因为它很容易出现死锁。引用与全局记录器字段相关的 Java 文档:
Deprecated: Initialization of this field is prone to deadlocks. The field must be initialized by the Logger class initialization which may cause deadlocks with the LogManager class initialization. In such cases two class initialization wait for each other to complete. As of JDK version 1.6, the preferred way to get the global logger object is via the call Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).
如果您真的很认真地对待日志记录(您应该认真对待),那么请考虑为每个组件声明记录器,这可以使用记录器设置以粒度方式进行控制。
与日志记录相关的其他链接:
关于Java 日志记录全局记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39050921/