Java记录全局记录器

Wir*_*der 1 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);
Run Code Online (Sandbox Code Playgroud)

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

我的问题是关于全局记录器的范围,它的全局范围是JVM吗?或全局范围的应用程序?如果全局范围在JVM上,我是否应该对共享相同JVM的应用程序产生副作用?提示:我已经完成了这个线程在java.util.logging中,什么是全局记录器?但评论不是我可以利用的.

Pra*_*nde 6

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

参考java.util.Logger,如果你是热衷于看它是如何被宣布.它已在第218行声明如下

    @Deprecated
218 public static final Logger global = new Logger(GLOBAL_LOGGER_NAME);
Run Code Online (Sandbox Code Playgroud)

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

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

如果您真的非常认真地记录日志(您应该这样做),那么请考虑使用记录器设置以粒度方式为每个组件声明记录器.

与记录相关的其他链接:

Java Logging API教程

配置Java记录器

良好的伐木实践