Java 日志记录全局记录器

标签 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?但是评论不是我可以利用的。

最佳答案

是的,每个 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 Logging API Tutorial

Configuring Java Loggers

Good logging practices

关于Java 日志记录全局记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39050921/

相关文章:

java - 验证组时会忽略 @Valid 注释

java - 监听时在 Socket 上发送

c# - 在 Appharbor 托管的网站上使用记录器的最简单方法是什么?

java - 在库中捆绑 log4j.properties - 糟糕的风格还是什么?

java - 如何从 Java 访问 Windows 事件查看器日志数据

java - 如何拦截wicket中的页面创建?

java - 对 Android 应用程序进行压力测试

java - JSF、JBOSS 显示不正确

Java未捕获异常

eclipse - 使用 Tomcat 7 降低 Eclipse WTP 中的日志级别