slf4j源码解析

本文详细研究了slf4j的源码,包括slf4j-api、slf4j-simple和slf4j-log4j12。探讨了slf4j的设计理念,如静态工厂方法获取logger实例,以及初始化过程。通过类加载机制,slf4j实现在运行时动态绑定日志框架。文章还介绍了如何创建自己的日志框架并接入slf4j。
摘要由CSDN通过智能技术生成


OK,现在我们来研究slf4j的源码。前面我转载了一篇上善若水的博客,其实里面已经写的很详细了。没看过slf4j的源码之前我只是大致的了解了slf的执行,看过源码以后不得不惊叹大师的设计,所以这里自己也认真的来整理一遍。

slf4j源码目录结构

首先,我们从githud上下载slf4j的源码到本地,这个源码用maven管理的,是一个多项目的框架,原来的目录结构如下:

 

ok,这里好多的子项目,都是slf4j可以桥接的日志框架。我自己删除了好多,只剩下slf4j-api,slf4j-simple,slf4j-log4j12这3个子框架用来研究源码。


slf4j-simple源码研究

首先,我们研究一下slf4j-simple。该框架的目录结构如下:

   这里我选中的3个才是一个简单的可以嫁入slf4j去桥接的日志框架的核心,必须有。



OK,然后我们可以自己写一个测试类,也可以直接用框架源码中的测试类。我这里直接拿来用了,测试代码如下:

package org.slf4j;

import java.io.PrintStream;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * @创建作者: LinkinPark
 * @创建时间: 2016年3月2日
 * @功能描述: 测试类,slf-simple默认只输出info级别的以上的。
 */
public class InvocationTest
{
	PrintStream old = System.err;

	@Before
	public void setUp() throws Exception
	{
		System.setErr(new SilentPrintStream(old));
	}

	@After
	public void tearDown() throws Exception
	{

		System.setErr(old);
	}

	@Test
	public void test()
	{
		Logger logger = LoggerFactory.getLogger("slf4j-simple-test");
		logger.info("Hello world.");
	}
}

先不用配置文件,直接使用框架默认值来输出日志。来运行一把测试看下效果,junit绿条,控制台输出如下:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [file:/Users/LinkinPark/WorkSpace/slf4j-frame-slf4j/slf4j-simple/target/classes/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [file:/Users/LinkinPark/WorkSpace/slf4j-frame-slf4j/slf4j-api/target/classes/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]
[main] INFO slf4j-simple-test - Hello world.

关于该框架的3个核心类的代码我这里就不贴出来了,和我自己前面写的日志框架一个意思,感兴趣可以去研究我前面的博客。

在simpleLoggerFactory类getLogger()方法上打一个断点,来看下方法调用栈。这个方法的意思就是从日志工厂中获取一个logger实例。

OK,调用过程如下,其实slf源码也没有多少,直接从头到尾看也很快的。


那我们现在就从头到尾看下整个执行过程。

1,平时我们在用logger的时候都要通过工厂类来获取这个实例。代码如下:

Logger logger = LoggerFactory.getLogger("slf4j-simple-test");
		logger.info("Hello world.");


2,上面工厂中获取logger实例的代码如下,中间这里用一个getILoggerFactory()方法来嫁入一层接口,所有的需要桥接到slf4j日志框架都需要实现ILoggerFactory接口。

/**
	 * @创建时间: 2016年3月2日
	 * @相关参数: @param name 日志名称
	 * @相关参数: @return
	 * @功能描述: 获取一个logger实例。
	 * <p>
	 * 这里嫁入一层ILoggerFactory,所有的日志框架都需实现该接口
	 * </p>
	 */
	public static Logger getLogger(String name)
	{
		ILoggerFactory iLoggerFactory = getILoggerFactory();
		return iLoggerFactory.getLogger(name);
	}

ILoggerFactory接口源码如下&#x

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值