繁体   English   中英

Log4j、commons-logging、JDK-Logging 和 SLF4J 是如何相互关联的?

[英]How do Log4j, commons-logging, JDK-Logging and SLF4J relate to each other?

它们是替代品、依赖关系、API 还是彼此的实现? 它们为什么存在?

啊,Java 中的日志框架。 您的问题混合了 2 种不同类型的库:

  • log4j 和 JDK 日志记录是用于处理日志记录的库
  • Commons Logging 和 SLF4J 是日志门面:你仍然需要一个真正的日志实现(比如 log4j)

如果您正在编写一个将在其他人的系统中使用的库,那么您应该使用日志外观,因为您不知道他们将使用哪个日志框架。 在这种情况下,请使用 SLF4J(Commons Logging 较旧并且存在一些类加载器问题)。

如果您控制整个应用程序并且可以指定使用哪个日志记录框架,您可以自由选择自己的偏好。 我的首选解决方案是(按优先顺序):

  • 回溯
  • log4j
  • JDK 日志记录(在我看来,SUN 的“不是在这里发明的”案例)

我最近也在研究这个。 多年来,我一直在使用 Log4J 和 Commons Logging,最近切换到 SLF4J。

Log4j

Log4j 是一个实际进行日志写入/分发的框架。 它非常灵活:您可以指示它将日志消息发送到文件、系统日志、远程监控等。您还可以配置多个记录器、记录类别、在条目中包含上下文等。 它是最流行的日志记录系统之一。

JDK 日志记录

JDK 1.4.2 中添加了内置的 JDK 日志记录(老实说,我从未使用过)。 据我所知,它不是很受欢迎,因为它不如 Log4j 灵活,但我欢迎评论:)。

Commons 日志记录SLF4j

这两者都是各种日志框架之上的外观,为您的应用程序提供了一个通用接口。 例如,您可以在应用程序中使用 CL/SLF4J,它们将自动检测底层记录器实现(Log4J、JDK 日志记录或仅委托给System.err.println()的内置记录器)。 好处是您或您的最终用户可以决定随意切换底层日志记录实现,它们通过消除 Log4J 和 JDK 日志记录的许多复杂性大大简化了您的实现。

大多数情况下,您会看到它们分层。

SLF4J 纯粹是一个抽象层,它本身并不用于实际的日志输出,而是由您在代码中用来记录消息。

一个典型的设置是使用 SLF4J 登录你的代码,然后使用 log4j 作为底层的“输出”层,使用适当的 slf4j->log4j 桥(一个 jar 你只包括在你的类路径中)。 为了合并来自不同来源的日志记录,存在各种桥梁。 例如,许多应用服务器(如 tomcat)将使用 JDK 日志记录来避免在已部署的应用程序上强制使用“非标准”日志记录框架。 为此,slf4j 有一个桥接器,它将从 JDK 日志记录中获取所有 output。 所以,这可能是一个堆栈

JDK-logging <- Your app-server or framworks might log using this
  |
(JDK->Slf4j bridge)
  |
Slf4j <- your application logs using Slf4j
  |
(Slf4j->log4j bridge)
  |
log4j <- log4j is just responsible for outputting to the appenders you configure (file, console etc)

SLF4J 只是具有不同后端(任何其他日志记录系统)的通用 API。 Log4j 和 commons-logging (CL) 不同的测井库,CL 是化石。 但是它们都有一个致命的缺陷,所以 sun 发明了 JDK 日志记录。

至于我,我更喜欢 SLF4J 作为最灵活的和logback作为它的后端。 Logback 是最现代的,并且有很多不错的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM