非静态日志可以证明合理吗?

Gug*_*see 8 java logging static

我是代码库中唯一使用Apache commons日志记录完成日志记录的维护者.

所有类都包含这两个导入:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Run Code Online (Sandbox Code Playgroud)

然后很多类包含非静态日志实例化,如下所示:

/** The log. */
private Log log = LogFactory.getLog(Xyz.class);
Run Code Online (Sandbox Code Playgroud)

这可以证明是合理的吗?

我可以安全地将所有这些更改为静态调用吗?

编辑关于它(显然)方便的特殊情况:我的问题实际上是"整个代码库中的非静态日志是否合理?"

Mic*_*rry 8

这取决于.这来自文档:

请注意,对于应用程序代码,将日志成员声明为"静态"更有效,因为每个类创建一个Log对象,建议使用.但是,对于可以通过servlet或j2ee容器或类似环境中的"共享"类加载器部署的类来说,这是不安全的.如果最终使用不同的thread-context-classloader值设置调用该类,则不能将该成员声明为static.因此,在任何"库"类型项目的代码中应避免使用"静态".


biz*_*lop 5

您必须非常小心地将非静态记录器初始化为您的代码片段在Serializable类中执行的方式.

首先因为Log不可序列化,所以任何序列化类的尝试都会失败.如果你声明你的记录器,transient那么合乎逻辑的做法是,你的log字段在反序列化后不会被初始化,所以你会NPE在尝试记录内容时花一些时间.不是很好的情况.

总而言之,如果您愿意,可以使用非静态记录器,但在使用它们之前确保它们已初始化.但除此之外,我不会担心非静态记录器,大多数日志记录实现总是会返回相同的记录器对象(log4j肯定会).