java - 每个实例记录器,不好的做法?

标签 java logging static instance java.util.logging

我有一个类(例如 FileConfig),它在程序中的许多不同位置使用,并且该类也是其(插件)API 的一部分。所以这个类应该是非常通用和广泛可用的。我想在此类中使用 Logger (java.util.logging.Logger)。每个类使用 private static final Logger 实例似乎是最佳实践,如许多代码示例所示。在我看来,这对我来说非常不灵活。我可以想到我或使用 API 的人想要对程序的特定部分使用不同的 Logger 实例的情况。下面的代码展示了我解决这个问题的想法。

import java.util.logging.Logger;

public class FileConfig {
    private static final Logger LOGGER = Logger.getLogger(FileConfig.class.getName());
    private Logger logger = LOGGER;

    public void setLogger(Logger logger) {
        if (logger == null) {
            throw new IllegalArgumentException("logger cannot be null");
        }

        this.logger = logger;
    }
}

这使得每个实例可以使用不同的Logger,而默认行为仍然与仅具有static Logger 字段相同。这段代码有问题吗?我有理由避免这种情况吗?无论出于何种原因,这种做法都是不好的吗?如果是,为什么?我也非常感谢您对此的个人意见或建议如何改进它。

最佳答案

Are there any problems with this code?

使用记录器的线程和更改记录器的线程之间没有线程安全的协调。没有 JavaDoc 说明使用假设。

Is there a reason why I should avoid that?

拥有一个可以在构造后调用的方法setLogger可能会允许消息在处理程序之间撕裂。更改类的记录器似乎需要权限检查。

I would also appreciate your personal opinion about this or suggestion how to improve it.

您不会禁止子类,因此检查类名可能会更安全:

import java.util.logging.Logger;

public class FileConfig {
    private final Logger logger = Logger.getLogger(getClass().getName());
}

想要使用不同记录器的调用者可以对“FileConfig”进行子类化。这允许在调用者的 namespace 中创建子类,这通常是您在组合对象时想要实现的目标。

关于java - 每个实例记录器,不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57350923/

相关文章:

java - HTML 单元 : filling a form that refreshes automatically

c# - 将 Appium 测试结果记录到控制台

c++ - 返回函数局部变量作为引用

python - 在具有多个进程的 uwsgi 中托管时,一些 django 的日志丢失

java - 为什么 Google 的 Gson 不是静态的?

CSS:如何制作输入文本边框以覆盖其周围的文本?

java - 如何在工作空间中永久添加 Selenium Firefox 配置文件

java - 我可以有一个类字段,它是必须扩展另一个类和接口(interface)的类型的 Class<?> 吗?

java - C# 中 Java 的 >>>= 是什么

logging - 将进程 ID 添加到 log4cxx 中的日志文件名