【问题标题】:What's the overhead of creating a SLF4J loggers in static vs. non-static contexts?在静态与非静态上下文中创建 SLF4J 记录器的开销是多少?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 这只是另一件不必关心的事情:如果你可以(基本上)使用@Inject private final Logger log;,我为什么要使用private static final Logger log = LoggerFactory.getLogger(MyClass.class);(大多数情况下无法注意到Ceki所说的开销)?
【解决方案2】:

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

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

SLF4J FAQ也讨论了这个问题。

【讨论】:

  • 所涉及的注入过程/查找呢?有什么缺点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
相关资源
最近更新 更多