java slf4j日志管理

SLF4J是Java的日志抽象层,提供统一的API,允许在部署时选择不同的日志系统,如log4j。它通过驱动和桥接机制与各种日志框架集成,无需修改代码即可切换日志实现。使用SLF4J可以方便地在不同日志系统间切换,例如从log4j到java.util.logging或simple日志系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。

    实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。

    驱动和桥接
    log4j是一个日志系统。
    slf4j是一个日志系统的封装,对外提供统一的API
    使用slf4j需要下载slf4j-api-x.x.x.jar 它提供对外一致的API接口,其本身不提供日志实现。假设我们选择log4j作为我们的日志实现,需要下载log4j-x.x.x.jar如果想把slf4j绑定log4j,则需要下载slf4j对log4j的相应”驱动”。slf4j-log4j12-x.x.x.jar这样就可以使用slf4j提供的API,用log4j实现打日志了。所谓驱动,就是实现了slf4j的一些接口,用你喜欢的日志系统打日志。slf4j还支持好多日志系统,并提供了相应的“驱动”包
    例如:
    slf4j-jdk14-x.x.x.jar是为java.util.logging提供的驱动
    slf4j-simple-x.x.x.jar直接绑定System.errlf4j-jcl-x.x.x.jar是为commons-logging提供的驱动
    logback-classic-x.x.x.jar是为logback提供的驱动
    如果你引入了一个第三方jar包或者你之前的工程使用了commons-logging打日志。你想换成slf4j,你不需要更改代码,你需要使用桥接,你可以引入jcl-over-slf4j.jar,同时去掉commons-logging.jar包,这样之前打的日志会自动切换到你的slf4j中来了。同样还有log4j-over-slf4j.jar and jul-to-slf4j.jar等用于使用其它日志系统的应用自动切换到slf4j统一打日志。

    这里其实用到了一种设计模式(Facade设计模式,门面设计模式)。如下图:


实例1:SLF4J+simple

导入:slf4j-api-1.7.21.jar 包
1.新建一个java类slf4jSimpleTest

package com.slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class slf4jSimpleTest{
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

2. 发现运行的时候,出错了。提示Failed to load class “org.slf4j.impl.StaticLoggerBinder”。说明默认的情况下SLF4J会去找默认的实现类。
导入slf4j-simple-1.7.21.jar包
重新执行程序,发现正确输出。结果如下:

[main] INFO com.souvc.log.slf4j.HelloWorld - Hello World

使用slf4j这种记录日志的方式的特点很明显:1、如果我们需要记录的是底层类库或者组件这种东西,就可以不影响或强制要求用户选择哪种日志系统。2、如果我们用特定的日志系统写了代码,但是有一天要求换另一种日志系统,如果之前就用slf4j的api写的,那就很简单,但是如果用具体的一种方式写了以后,那在切换就很麻烦。

实例2:

package com.slf4j;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Slf4jTest {
	// 首先获得日志记录这个对象
	static private Logger logger = LoggerFactory.getLogger(Slf4jTest.class);

	public static void main(String[] args) {
		// 记录error信息
		logger.error("[info message]");
		// 记录info,还可以传入参数
		logger.info("[info message]{},{},{},{}", "abc", false, 123, new Slf4jTest());
		// 记录debug信息
		logger.debug("[debug message]");
		// 记录trace信息
		logger.trace("[trace message]");
	}
}
具体使用哪种日志系统,这个可以随意切换,切换方式就是将我们的jar包替换成切换的模式

(1)使用slf4j的simple日志系统:
    在classpath中加入:slf4j-simple.jar

(2)切换成jdk的日志系统:

    在classpath中将slf4j-logo.jar换成slf4j-jdk.jar

(3)切换成log4j的日志系统:
    ​在classpath中将slf4j-logo.jar换成slf4j-log4j.jar,注意这在使用log4j的时候,需要自己配置log4j.properites文件或者log4j.xml。

切换成其他的日志,方法都是一样的,直接替换相关日志jar包就可以了。

如果classpath中有多种日志系统,slf就会将每个系统的日志信息都显示出来,这样的话我们就没办法分辨出,这样会很乱






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值