java为什么记录器大部分时间是静态的?
为什么在java中使用Logger
和static
作为“最佳实践”
public static final Logger LOGGER = LoggerFactory.getLogger(....)
我想不出原因。如果我使用一个logger实例并通过构造函数传递它,它应该不会影响性能
有人能解释为什么吗?比戴好吗?如果是,为什么?有很多意见。还是仅仅是“因为java方式”
你可以在下面搜索框中键入要查询的问题!
为什么在java中使用Logger
和static
作为“最佳实践”
public static final Logger LOGGER = LoggerFactory.getLogger(....)
我想不出原因。如果我使用一个logger实例并通过构造函数传递它,它应该不会影响性能
有人能解释为什么吗?比戴好吗?如果是,为什么?有很多意见。还是仅仅是“因为java方式”
# 1 楼答案
以防止不必要地创建多个实例。一般来说,一个
Logger
就足够了,因为它写入一个逻辑位置(可能是多个物理输出流)。如果您将Logger
传递给一个方法,那么它可能是通过编程来处理日志记录的。相反,我建议您更喜欢记录器自己的配置机制来启用和禁用消息传递# 2 楼答案
private-这样就没有其他类可以劫持你的记录器了
静态-因此每个类只有一个记录器实例,也避免了序列化记录器的尝试
最终-在类的生命周期内无需更改记录器
然而,这些规则有一个有趣的例外:
受保护的最终记录器日志=LoggerFactory。getLogger(getClass())
前一种方法允许在整个继承层次结构的所有类中使用相同的记录器名称(实际类的名称)。因此,如果Bar扩展了Foo,两者都将登录到Bar记录器。有些人觉得这更直观
非静态表单的优点是,您可以在下面这样的(抽象)基类中声明它,而不必担心会使用正确的类名
然而,它的缺点显然是,将为类的每个实例创建一个全新的记录器实例
另一方面,如果您通过工厂获取记录器,而工厂又可能缓存已经实例化的记录器,那么使用非静态表单不会增加太多开销。例如,Log4j有一个用于此目的的LogManager
受保护的日志=日志管理器。getLogger(getClass())