【问题标题】:Is Log4j being abandoned in favor of Slf4j? [closed]Log4j 是否被放弃以支持 Slf4j? [关闭]
【发布时间】:2010-01-14 12:03:21
【问题描述】:

log4j 似乎有一些class loading issues(以及其他),在我看来,趋势是从 log4j 转向 slf4j。 (Hibernate 停止使用第一个,转而使用后者)

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

更新:

  • 所以这个 delfuego 的answer 让我很困惑,你能接受/反对吗?:

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

【问题讨论】:

标签: java log4j slf4j


【解决方案1】:

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:几天前我有一个非常相似的问题,并开始使用在后台使用 slf4j 的 Logback。
  • ?!可变参数不会停止函数的执行……是吗?
  • 否,但它确实停止了 toString 的执行,当您将对象连接到字符串时会发生这种情况。日志记录昂贵的主要问题不是对日志函数的调用,而是记录字符串的构造!
  • 准确来说,logback 是 log4j 的一个 fork,由 log4j 原创始人,他想继承 log4j。
  • @Wouter 是的!您应该使用具有传递对象编码器的日志库,因此不会调用 toString() 并且对象的内容会直接复制到字节缓冲区。 MentaLog 就是这样一个日志库,通过采用该策略根本不会产生垃圾:mentalog.soliveirajr.com/posts/list/32.page
【解决方案2】:

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

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

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

【讨论】:

  • 所以这个答案令人困惑:stackoverflow.com/questions/1974705/… 它暗示 slfJ 毕竟解决了 Log4j 造成的问题......难道除了它的 Facade 功能之外,它还有一个更好的独立本机日志实现比 log4j?
  • SLF4J 需要一个真正的日志实现。这仍然可以是 Log4j,或者您可以使用 Logback,它本机实现了 SLF4J 接口(SLF4J 和 Logback 是由同一个人编写的)。
  • 这只是一个门面。但是,有一个名为 Logback 的新实现,旨在成为 SLF4J 的一流实现。值得注意的是,SLF4J、Log4J 和 Logback 都是由基本上认为 Log4J 停滞不前的同一个人创建的。他在 StackOverflow 上有一个帐户(用户名为 Ceki),并且倾向于在大多数 Log4J/SLF4J 线程中重申这一点。
  • 好吧,Slf4J 的原生实现可能优于 Log4J,但它的主要目的是将日志框架的选择与应用程序框架/库的选择分离。仅仅使用 Slf4J 来包裹 Log4J 并不能解决你的类加载器问题。
  • @EJB:什么类加载器问题?文章参考是关于 Jakarta Commons Logging。根据我的阅读,SLF4J 本身不能优于 Log4J,因为它本身不起作用 - 它必须与真正的日志库捆绑在一起(其中之一实际上是 log4j)。
【解决方案3】:

首先:重要的一点: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(见下文)。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • slf4j 不是日志框架。它是几个日志框架之一的外观。
      【解决方案6】:

      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 不支持同一类的多个日志文件;例如,一个用于事件日志,一个用于原始数据日志)。

      【讨论】:

        猜你喜欢
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 2012-02-01
        • 2016-09-17
        • 2018-03-23
        • 2018-03-22
        • 1970-01-01
        • 2015-05-08
        相关资源
        最近更新 更多