【发布时间】:2012-05-07 21:01:04
【问题描述】:
我一直使用以下模式来构建 (SLF4J) 记录器:
private static final Logger log = LoggerFactory.getLogger(MyClass.class);
到目前为止,这已经奏效了,但我想知道 static 上下文在某些时候以及是否需要一直传入具体的类文字,而不是仅仅使用像这样的非静态记录器
private final Logger log = LoggerFactory.getLogger(getClass());
在 LOG4J 之前,这基本上已经被问到(并得到了回答)
Should logger be private static or not
这里
Should be logger always final and static?
我意识到final 基本上是强制性的,所以我想知道在非静态上下文中使用 SLF4J 的开销实际上有多高。
问:
是否有任何显着的实际使用开销
private final Logger log = LoggerFactory.getLogger(getClass());
结束
private static final Logger log = LoggerFactory.getLogger(MyClass.class);
在平均(网络)应用中? (这里无需“讨论”高端、重负载的 webapp)
请注意,我最终计划使用一种更好的方法,使用 CDI 来获得类似的 SLF4J 记录器
@Inject private final Logger log;
如此处所述http://www.seamframework.org/Weld/PortableExtensionsPackage#H-TtLoggerttInjection,但我需要先了解记录器缓存。
子问题:甚至可以使用吗?:
@Inject private static final Logger log;
(说实话只是从 CDI 开始)
【问题讨论】:
-
请注意,如果您使用
getClass(),则记录器名称/类别可能会在存在子类时意外更改。 -
谢谢。我实际上在这里寻找“记录器创建模式”,但我不得不承认我不是 100% 确定自己的用例,即我是否希望可能的子类获得自己的记录器,或者我是否想要重用共享超类中的一个。 :-/
-
如果你使用jcabi-log,你可以完全摆脱这个变量,一个围绕slf4j的静态包装器
标签: java logging static cdi slf4j