2010-01-14 72 views
47

看来,log4j有一些class loading issues(等等),在我看来趋势是走出log4j走向slf4j。 (休眠停止使用第一个有利于后者)Log4j被弃用而转向Slf4j吗?

  1. 它是真的吗?
  2. slf4j解决log4j中的主要问题是什么?
  3. slf4j是最后一个词还是有更好的“下一个log4j”行业标准?

更新:

  • 所以这answer通过delfuego混淆了我,你能接受/反对它?:

您出现于 主要问题已经迷迷糊糊与log4j(和 Apache Commons Logging库), 即它们有一个可笑的 使用正确的类加载器难以发现和交互 ,因为它们使用的是 。这里有一个非常密集的 解释,并附有示例, ; 的回收信息是 新的日志记录框架SLF4J的主要驱动力之一是 完全消除了这些问题。你 可能想要交换它,看看你的生活是否更容易 。

+4

您在http://articles.qos.ch/classloader.html中引用的文章不是关于使用log4j而是使用Jakarta Commons Logging(另一个日志记录外观)加载类的问题。这是SLF4J替代并捆绑了实际底层日志记录系统的代码(包括可能的log4j)以消除这些类加载问题。 – 2010-01-14 13:28:27

+0

可能重复[应该新项目使用logback而不是log4j?](http://stackoverflow.com/questions/178836/should-new-projects-use-logback-instead-of-log4j) – ripper234 2011-11-22 09:44:53

回答

46

Slf4j确实只是一个记录外观。但是,Log4j旨在由来自同一作者的Logback继承。

更新:如果你想知道关于SLF4J的另一个好处,这是事实,以下是不需要(难看)构建了以避免不必要的toString()被称为:

if (logger.isDebugEnabled()) { 
    logger.debug("Message: " + bigObject + ", " + anotherBigObject); 
} 

您可以改为使用参数化的消息:

logger.debug("Message: {}, {}", bigObject, anotherBigObject); 

另见What is the fastest way of (not) logging?

+0

+1:几天前我有一个非常类似的问题,并开始使用在后台使用slf4j的Logback。 – lostiniceland 2010-01-14 12:26:50

+0

?!可变参数并不会停止执行功能......是吗? – 2010-01-14 12:37:02

+4

不,但它确实停止了将对象连接到字符串时发生的toString的执行。日志记录代价高昂的主要问题不是对日志函数的调用,而是日志字符串的构造! – 2010-01-15 11:25:05

6

望着slf4j page它看起来并不像它会取代 log4j的 - 它只是允许你使用相同的底层日志框架(比如log4j),这样库就可以自动的挂钩了。

它看起来更像是一个替代Apache Commons Logging比log4j。

3

在我看来,SLF4J具有巨大的优势,可以通过它提供的桥统一记录所有使用的库。其他日志框架都不允许这样做。这允许项目顺利转移到SLF4J并忽略依赖关系所做的日志框架选择。

+1

slf4j不是日志记录框架。这是几个日志框架之一的外观。 – 2010-01-14 13:30:27

18

SLF4J不是Log4j的替代方案,而是提供了一个门面的记录,所以可以你可以在自己的日志框架插头。它主要用于图书馆。 从slf4j.org:

的简单的日志门面为Java或 (SLF4J)用作简单门面或 抽象关于各种记录 框架,例如java.util.logging, log4j和logback,允许结束 用户在部署时插入所需的日志记录 框架。

要回答你的问题:被采纳SLF4J的框架了,但在你的项目,你可以继续使用的Log4J(或任何其他)

+0

所以这个答案很混乱:http:// stackoverflow。com/questions/1974705/log4j-and-the-thread-context-classloader/1974775#1974775它意味着slfJ解决了由Log4j创建的所有问题......它可能是除了它的Facade特性外,它还有一个很好的独立本地日志记录实施比log4j更好? – ruchirhhi 2010-01-14 12:15:24

+1

SLF4J需要在其下执行实际的日志记录。这仍然可以是Log4j,也可以使用Logback,它本地实现SLF4J接口(SLF4J和Logback由同一人编写)。 – SteveD 2010-01-14 12:25:57

+0

这只是一个门面。然而,有一个名为Logback的新实现,旨在成为SLF4J的一流实现。值得注意的是,SLF4J,Log4J和Logback都是由基本上将Log4J视为停滞的同一个人创建的。他在StackOverflow上有一个帐户(用户名是Ceki),并且倾向于在大多数Log4J/SLF4J线程中重申这一点。 – GaryF 2010-01-14 12:26:45

7

第一:很重要的一点:SLF4J是前端测井(API),它可以在大多数主要的登录系统下使用:例如log4j或java.util.logging。所以最好将sfl4j与commons-logging进行比较。

关于Log4j的状态,从The state of java logging(一年前)报价,我还没有意识到

的一件事是log4j的发展基本上是死的。目前它的版本是1.2,而版本1.3的计划已经放弃,开发log4j 2.0。但是,目前看来2.0并未处于积极的发展阶段。值得注意的是,log4j项目的创始人CekiGülcü已经转向slf4j(见下文)。

3

Slf4j不是真正的采伐门面。 Slf4j不支持其实现者的许多功能。 简而言之,我在下面提到了log4j示例。

  • SLF4J不能指定用户选择的配置文件,但强制用户在如此众多的Java根源之一(使用默认值(log4j.properties或log4j.xml文件),每罐有一个根加JVM根和类或箱)。如果两个JAR文件具有它,则很难控制哪一个安全使用。
  • Slf4j无法支持所有Log4j级别,例如'致命'。当从Log4j切换到Slf4j的大代码时,需要进行巨大的代码更改(例如,决定如何重新排列级别)。
  • 必须选择两个关键Jar文件(log4j-over-slf4j.jar或slf4j-log4j12.jar)。如果classpath都是,将无法工作。如果随机选择一个,会丢失意想不到的功能(例如,log4j-over-slf4j.jar不支持同一类的多个日志文件;例如一个用于事件日志,一个用于原始数据日志)。