【问题标题】:Are there any performance overheads using slf4j with log4j vs using log4j alone?使用带有 log4j 的 slf4j 与单独使用 log4j 是否有任何性能开销?
【发布时间】:2011-08-17 14:07:15
【问题描述】:

我正在考虑将 java 1.4.2 项目从 log4j 迁移到 slf4j。这是参数化日志记录和代码清晰性的优势(如果 log.isdebug.. 则不需要),这让我想到了这些考虑。

转换为 slf4j 有性能开销吗?

上次我检查是否可以使用 logback,它对 jdk 有一个要求,要求它至少为 1.5,这就是我考虑 slf4j 和 log4j 的原因。

【问题讨论】:

  • 您是否进行了一些性能测试并比较了结果?
  • logback 可以逆编到 1.4。我这样做了,它奏效了,但我建议进行广泛的测试以确定。请注意,您还可以将标准 JDK14 日志记录与 slf4j 一起使用。

标签: java log4j slf4j


【解决方案1】:

不,如果有的话,你应该从 slf4j 获得性能优势,因为(如果你使用参数化消息)那么slf4j defers turning its parameters to strings until it has checked that the message won't be filtered out by log level

有一个基于消息格式的非常方便的替代方案。假设 entry 是一个对象,你可以这样写:

Object entry = new SomeObject();
logger.debug("The entry is {}.", entry);

在评估是否记录后,并且只有在决定是肯定的情况下,记录器实现才会格式化消息并将“{}”对替换为条目的字符串值。换句话说,这种形式不会在日志语句被禁用的情况下产生参数构造的成本。

以下两行将产生完全相同的输出。但是,在禁用日志记录语句的情况下,第二种形式的性能将比第一种形式至少高出 30 倍。

logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);

【讨论】:

  • @Rulmeq:是slf4j,我添加了文档链接
  • 谢谢,我一直认为你需要 logback,所以我一直在避免迁移到 SL4J(如果不花你的一生向高层解释,就不能真正在生产中使用 0.x 任何东西)。这是个好消息:)
猜你喜欢
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2015-08-15
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 2016-11-11
相关资源
最近更新 更多