Log4j是否被抛弃而支持Slf4j?

时间:2010-01-14 12:03:21

标签: java log4j slf4j

似乎log4j有一些class loading issues(等等),在我看来,趋势是从log4j移出slf4j。 (Hibernate停止使用第一个支持后者)

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

    • 所以delfuego的answer让我困惑,你能接受/反对吗?:
      你似乎偶然发现了   log4j的主要问题(和   Apache Commons Logging库),   即他们有一个可笑的   很难发现和互动   与正确的类加载器一样   正在使用。有一个非常密集的   解释,附有例子,   这里; 带回家的消息就是这样   的主要推动力之一   新的日志框架SLF4J是   完全消除这些问题。你   可能想要交换它,看看是否   你的生活变得更轻松了。

6 个答案:

答案 0 :(得分:47)

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?

答案 1 :(得分:18)

Slf4J不是Log4j的替代品,而是提供了一个用于日志记录的Facade,因此您可以插入自己的日志框架。它主要用于图书馆。 来自slf4j.org:

  

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

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

答案 2 :(得分: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 :(得分:6)

查看slf4j page它看起来不会替换 log4j - 它只允许您为整个应用程序使用相同的底层日志记录框架(例如log4j),允许库自动挂钩。

它看起来更像是Apache Commons Logging的替代品,而不是log4j。

答案 4 :(得分:3)

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

答案 5 :(得分:3)

Slf4j不是真正的日志记录。 Slf4j不支持其实现者的许多功能。 简而言之,我在下面提到log4j示例。

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