繁体   English   中英

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

[英]Logger per instance, bad practice?

我有一个类(示例 FileConfig),它在程序的许多不同地方使用,并且该类也是其(插件)API 的一部分。 所以这个类应该是非常通用和广泛可用的。 我想在这个类java.util.logging.Logger使用一个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字段相同。 这段代码有问题吗? 有什么我应该避免的理由吗? 无论出于何种原因,这是不好的做法吗? 如果是,为什么? 我也很感激您对此的个人意见或如何改进它的建议。

这段代码有问题吗?

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

有什么我应该避免的理由吗?

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

我也很感激您对此的个人意见或如何改进它的建议。

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

import java.util.logging.Logger;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM