[英]How do Log4j, commons-logging, JDK-Logging and SLF4J relate to each other?
它们是替代品、依赖关系、API 还是彼此的实现? 它们为什么存在?
啊,Java 中的日志框架。 您的问题混合了 2 种不同类型的库:
如果您正在编写一个将在其他人的系统中使用的库,那么您应该使用日志外观,因为您不知道他们将使用哪个日志框架。 在这种情况下,请使用 SLF4J(Commons Logging 较旧并且存在一些类加载器问题)。
如果您控制整个应用程序并且可以指定使用哪个日志记录框架,您可以自由选择自己的偏好。 我的首选解决方案是(按优先顺序):
我最近也在研究这个。 多年来,我一直在使用 Log4J 和 Commons Logging,最近切换到 SLF4J。
Log4j 是一个实际进行日志写入/分发的框架。 它非常灵活:您可以指示它将日志消息发送到文件、系统日志、远程监控等。您还可以配置多个记录器、记录类别、在条目中包含上下文等。 它是最流行的日志记录系统之一。
JDK 1.4.2 中添加了内置的 JDK 日志记录(老实说,我从未使用过)。 据我所知,它不是很受欢迎,因为它不如 Log4j 灵活,但我欢迎评论:)。
这两者都是各种日志框架之上的外观,为您的应用程序提供了一个通用接口。 例如,您可以在应用程序中使用 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.