Java 什么';在静态和非静态环境中创建SLF4J记录器的开销是多少?

Java 什么';在静态和非静态环境中创建SLF4J记录器的开销是多少?,java,logging,static,cdi,slf4j,Java,Logging,Static,Cdi,Slf4j,我一直使用以下模式构造(SLF4J)记录器: 到目前为止,这已经奏效了,但是我想知道在某个点上的静态上下文,以及是否需要一直传递具体的类文本,而不是仅仅使用像这样的非静态记录器 private final Logger log = LoggerFactory.getLogger(getClass()); @Inject private final Logger log; 这在LOG4J之前基本上已经被问过(并得到了回答) 这里呢 我意识到final基本上是强制性的,所以我想知道在非静态上

我一直使用以下模式构造(SLF4J)记录器:

到目前为止,这已经奏效了,但是我想知道在某个点上的
静态
上下文,以及是否需要一直传递具体的类文本,而不是仅仅使用像这样的非静态记录器

private final Logger log = LoggerFactory.getLogger(getClass());
@Inject private final Logger log;
这在LOG4J之前基本上已经被问过(并得到了回答)

这里呢

我意识到
final
基本上是强制性的,所以我想知道在非静态上下文中使用SLF4J的开销到底有多高

Q:

是否存在显著的实际使用开销

private final Logger log = LoggerFactory.getLogger(getClass());
结束

平均(web)应用程序中?(此处无需“讨论”高端、高负载的Web应用程序)


注意,我最终计划使用一种更好的方法,使用CDI获得一个类似SLF4J的记录器

private final Logger log = LoggerFactory.getLogger(getClass());
@Inject private final Logger log;
如本文所述,但我需要首先了解记录器缓存

子问题:甚至可以使用吗

@Inject private static final Logger log;

(老实说,仅从CDI开始)

我不确定使用LoggerFactory时的确切开销,但我怀疑它是否会影响应用程序性能。因此,只要使用静态或非静态,因为你认为合适

使用@Inject有什么好处。LoggerFactory已经提供了从具体impl中提取的功能。在任何情况下,它都会比LoggerFactory慢很多


当您使用@Inject时,语法更加简洁,这是真的。但是,假设您在测试中使用该类。然后您必须设置注入以获得日志记录。对于正常的LoggerFactory,它在测试中也能很好地工作。如果java有一个@Inject的通用机制,那么它会工作得很好,但是由于它的设置比较困难。

非静态(实例)记录器变量的开销应该可以忽略不计,除非发生了很多实例化,比如10000或更多。这里的关键词可以忽略不计。如果实例化了许多(>10000)对象,其影响可能是可测量的,但仍然很低

更具体地说,实例记录器会将每个对象实例的内存占用增加一个引用(64位)。在CPU端,成本是每个实例一次哈希查找,即在哈希表(小)中查找适当记录器的成本。同样,除非创建许多对象,否则这两种成本都应该可以忽略不计


此问题也在中讨论。

请注意,如果使用
getClass()
记录器名称/类别在存在子类时可能会意外更改。谢谢。实际上,我在这里寻找一种“记录器创建模式”,但我必须承认,我不能100%确定我自己的用例,即我是否希望可能的子类获得自己的记录器,或者我是否希望重用共享超类中的记录器-/如果您使用slf4jIt的静态包装器,那么您完全可以摆脱这个变量,这只是另一件不必关心的事情:如果您(基本上)可以使用
@Inject private final Logger log为什么我应该使用私有静态最终记录器log=LoggerFactory.getLogger(MyClass.class)(大多数情况下无法注意到Ceki所述的开销)?所涉及的注入过程/查找如何?有什么缺点吗?