28

我一直使用以下模式来构建(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 开始)

4

2 回答 2

26

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

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

SLF4J FAQ中也讨论了这个问题。

于 2012-05-04T21:54:34.817 回答
2

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

使用@Inject 应该有什么好处。LoggerFactory 已经提供了具体 impl 的抽象。无论如何,它都会比 LoggerFactory 慢很多。

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

于 2012-05-04T21:42:17.903 回答