【问题标题】:Should I use slf4j as wrapper for logback?我应该使用 slf4j 作为 logback 的包装器吗?
【发布时间】:2012-12-06 15:48:13
【问题描述】:

假设有一个应用程序,它直接使用log4j,即。 e.没有slf4j 或任何其他包装器。现在我想用logback 替换log4j。我应该使用slf4j(或任何其他包装器)吗?什么被认为是“良好做法”?

【问题讨论】:

  • 当你在一年内从 logback 迁移到 xxx 时,如果你使用过 slf4j,它会让改变变得不那么痛苦。
  • slf4j 不是 logback 的包装器,因为 logback 是根据 slf4j-api 实现的。

标签: java logging log4j slf4j logback


【解决方案1】:

您当然应该使用 slf4j API,如果您以后决定返回 log4j 或其他方式,您只需要更改 slf4j 桥接器,您的应用程序日志记录代码将无需更改即可工作。此外,如果你访问http://www.slf4j.org/,你会看到 slf4j 将 Logback 视为其原生实现,而 Logback 实际上原生实现了 SLF4J API。

【讨论】:

    【解决方案2】:

    正如 Evgeniy Dorofeev 所说,logback 原生实现了 slf4j-api。这意味着通过 slf4j-api(即通过 org.slf4j.Logger 的实例)调用 logback 记录器根本不会产生任何开销。您可以直接调用 ch.qos.logback.classic.Logger 类型的记录器而不是 org.slf4j.Logger,但这样做并没有带来任何好处,但如果您选择这样做,可能会使迁移到不同的日志记录框架变得更加困难。

    顺便说一句,slf4j 不是 logback 的 包装器,因为 logback 是根据 slf4j-api 实现的。

    为了方便迁移到 SLF4J,有一个用于migrating source code to slf4j 的工具。对于你不能修改的代码,有bridges for log4j、java.util.logging和commons-logging。

    【讨论】:

      【解决方案3】:

      您可以使用log4j-over-slf4j.jar 而不是“真正的”Log4J 进行迁移,而无需更改任何代码。这为其客户端提供了与 Log4J 相同的 API,但将日志记录调用定向到 SLF4J,而 SLF4J 又可以将它们发送到 logback。

      但是,如果您可以选择修改代码,那么我建议您将其更改为使用 SLF4J,然后您可以根据需要交换任何后端(logback、log4j 等)。您不能做的一件事是尝试将 log4j-over-slf4j 与 Log4J 后端结合使用...

      【讨论】:

        【解决方案4】:

        不管实际的日志后端如何,使用 SLF4J api 有一个很好的理由,即

         log.debug("Foo: {}, Bar: {}", foo, bar);
        

        参数构造。 Log4j 总是需要一个完整的字符串来记录,这就是为什么你需要围绕ifs 来查看是否为昂贵的字符串启用了语句。 SLF4J 在进行检查之前不会调用 foo.toString() 或 bar.toString(),因此禁用调用很便宜。

        因此,我建议将您的源代码迁移到 slf4j,并在 slf4j 下载中使用适当的桥接器以使用 log4j 作为后端。这将允许您像现在一样继续操作,无需进一步更改。然后,您可以根据需要将后端切换到 logback。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-11
          • 2019-11-25
          相关资源
          最近更新 更多