49

似乎 log4j 有一些类加载问题(等等),在我看来,趋势是从 log4j 转向 slf4j。(Hibernate 停止使用第一个,转而使用后者)

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

更新:

您似乎偶然发现了 log4j(和 Apache Commons Logging 库)的主要问题,即它们在使用正确的类加载器时很难发现并与之交互。这里有一个非常密集的解释,并附有示例;带回家的信息是,新的日志框架 SLF4J 的主要驱动力之一是完全消除这些问题。您可能想换掉它,看看您的生活是否变得更轻松。

4

6 回答 6

47

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

更新:如果您想了解 Slf4j 的另一个好处,事实是不再需要以下(丑陋的)构造来避免toString()不必要的调用:

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

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

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

另请参阅什么是(非)记录的最快方式?

于 2010-01-14T12:16:20.543 回答
18

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

Java 或 (SLF4J) 的简单日志外观作为各种日志框架的简单外观或抽象,例如 java.util.logging、log4j 和 logback,允许最终用户在部署时插入所需的日志框架。

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

于 2010-01-14T12:08:26.973 回答
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 项目的原始创始人 Ceki Gülcü 已经转向 slf4j(见下文)。

于 2010-01-14T12:09:24.553 回答
6

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

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

于 2010-01-14T12:07:13.537 回答
3

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

于 2010-01-14T12:08:10.220 回答
3

Slf4j 不是一个真正的日志外观。Slf4j 不支持其实现者的许多特性。简而言之,我在下面提到 log4j 示例。

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