Log4j 与 SLF4J
SLF4J 与 Log4j 的区别
SLF4J(Simple Logging Façade for java)是一个 API,旨在提供对许多日志框架的通用访问,log4j 就是其中之一。
它基本上是一个抽象层。它不是日志记录实现。这意味着如果您正在编写一个库并且您使用 SLF4J,您可以将该库提供给其他人使用,他们可以选择与 SLF4J 一起使用的日志记录实现,例如 log4j 或 Java 日志记录 API。它用于防止应用程序依赖于不同的日志 API,就像它们使用依赖它们的库一样。
SLF4J 和 Log4J 不同,或者它们不是相似的组件。正如所指定的名称,SLF4J 是一个简单的 java 日志记录外观。它不是一个日志组件,甚至它也不做实际的日志记录。它只是底层日志组件的抽象层。
在Log4j的情况下,它是一个日志组件,它执行指示的日志记录。所以我们可以说 SLF4J 和 Log4J 在逻辑上是两个不同的东西。
现在,您只需选择在运行时需要使用哪个日志记录框架。为此,您需要包含两个 jar 文件:
- SLF4J绑定jar文件
- 所需的日志框架 jar 文件
例如,要在您的项目中使用 log4j,您需要包含以下 jar 文件:
- slf4j-log4j12-1.7.12.jar
- log4j-1.2.17.jar
一旦你将两个 jar 文件放在你的应用程序类路径中,SLF4J 将自动检测它并开始使用 log4j 根据你在 log4j 配置文件中提供的配置来处理日志语句。
例如,您可以在项目类文件中编写以下代码:
package cn.xnip;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld
{
public static void main(String[] args)
{
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
为什么 SLF4J 优于 Log4J?
在 SLF4J 和 Log4j 之间选择一个总是很困难的。如果你有选择,我会建议你;日志抽象总是比日志框架更可取。如果您使用日志抽象,特别是 SLF4J,我们可以迁移到我们在部署时需要的任何日志框架,而无需选择单一依赖项。
以下是足以选择 SLF4J 而不是 Log4j 的原因:
- 使用抽象总是更好。
- SLF4J 是一个开源库或内部库,使其独立于任何特定的日志记录实现,这意味着无需为多个库管理多个日志记录配置。
- SLF4J 提供基于占位符的日志记录,通过删除 isInforEnabled()、isDebugEnabled() 等检查来提高代码的可读性。
- 通过使用 SLF4J 的日志记录方法,我们将构建日志消息(字符串)的成本推迟到您需要时,这既节省 CPU 又节省内存。
- 由于 SLF4J 使用较少数量的临时字符串意味着垃圾收集器的工作更少,这意味着您的应用程序的吞吐量和性能更好。
所以本质上,SLF4J 并没有取代 log4j;他们一起工作。它从您的应用程序中删除了对 log4j 的依赖,并且可以在将来使用功能更强大的库轻松替换它。