假设有一个应用程序log4j
直接使用,即没有slf4j
或任何其他包装器。现在我想log4j
用logback
. 我应该使用slf4j
(或任何其他包装器)吗?什么被认为是“良好做法”?
4 回答
您当然应该使用 slf4j API,如果您以后决定返回 log4j 或其他方式,您只需要更改 slf4j 桥接器,您的应用程序日志代码将无需更改即可工作。此外,如果你访问http://www.slf4j.org/你会看到 slf4j 将 Logback 视为其原生实现,Logback 实际上原生实现了 SLF4J API。
正如 Evgeniy Dorofeev 所提到的,logback 原生实现了 slf4j-api。这意味着通过 slf4j-api(即通过实例)调用 logback 记录器org.slf4j.Logger
根本不会产生任何开销。您可以直接调用类型的记录器ch.qos.logback.classic.Logger
而不是这样做,org.slf4j.Logger
但这样做不会提供任何优势,但如果您选择这样做,可能会使迁移到不同的日志记录框架变得更加困难。
顺便说一句,slf4j 不是 logback 的包装器,因为 logback 是根据 slf4j-api 实现的。
为了简化向 SLF4J 的迁移,有一个用于将源代码迁移到 slf4j的工具。对于您无法修改的代码,有log4j、java.util.logging 和 commons-logging 的桥梁。
您可以使用log4j-over-slf4j.jar
代替“真正的”Log4J 进行迁移,而无需更改任何代码。这向其客户端提供了与 Log4J 相同的 API,但将日志记录调用定向到 SLF4J,而 SLF4J 又可以将它们发送到 logback。
但是,如果您可以选择修改代码,那么我建议您将其更改为使用 SLF4J,然后您可以根据需要交换任何后端(logback、log4j 等)。你不能做的一件事是尝试与log4j-over-slf4j
Log4J 后端结合......
无论实际的日志记录后端如何,使用 SLF4J api 都有一个很好的理由,即
log.debug("Foo: {}, Bar: {}", foo, bar);
参数构造。Log4j 总是需要一个完整的字符串来记录,这就是为什么你需要围绕if
s 来查看是否为昂贵的字符串启用了语句。SLF4J 在进行检查之前不调用 foo.toString() 或 bar.toString() ,因此禁用调用很便宜。
因此,我建议将您的源代码迁移到 slf4j 并在 slf4j 下载中使用适当的网桥以使用 log4j 作为后端。这将允许您像现在一样继续操作,无需进一步更改。然后,如果需要,您可以将后端切换到 logback。