在静态和非静态上下文中创建SLF4J记录器的开销是多少?

我总是使用以下模式构建(SLF4J)记录器:

private static final Logger log = LoggerFactory.getLogger(MyClass.class); 

到目前为止这已经奏效了,但我想知道static上下文在某些时候需要传递具体的类文字,而不是仅仅使用非静态记录器

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

这之前基本上已经问过(并回答过)LOG4J

记录器应该是私有静态还是非静态

和这里

记录器应该是最终的和静态的吗?

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

问:

使用是否有任何重大的实际开销

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

过度

 private static final Logger log = LoggerFactory.getLogger(MyClass.class); 

普通 (网络)应用程序? (这里不需要“讨论”高端,重载的webapps)


注意,我最终计划使用更好的方法使用CDI来获得SLF4J记录器

 @Inject private final Logger log; 

如http://www.seamframework.org/Weld/PortableExtensionsPackage#H-TtLoggerttInjection所述 ,但我需要先了解记录器缓存。

子问题:甚至可以使用?:

 @Inject private static final Logger log; 

(刚开始用CDI开头)

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

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

SLF4J常见问题解答中也讨论了这个问题 。

我不确定使用LoggerFactory时的确切开销,但我怀疑它会影响您的应用程序性能。 因此,只需根据需要使用静态或非静态。

使用@Inject应该有什么好处。 LoggerFactory已经从具体的impl中提供和抽象。 在任何情况下,它都会比LoggerFactory慢很多。

使用@Inject时,语法更简洁。 但想象一下,你在测试中使用了这个类。 然后,您必须设置注入以获取日志记录。 使用普通的LoggerFactory,它在测试中也能很好地工作。 如果java有一个@Inject的通用机制,它会很好用,但因为它的设置比较困难。

Interesting Posts