日志介绍
1、具体日志功能的实现有以下几种
JUL
Log4j
Logback
Log4j2
Logback的实现类Logger,实现了slf4j的Logger接口
2、日志门面框架:
日志实现的抽象层,定义log的Info,debug这些方法。
JCL
SLF4J
如下图,SLF4J定义了一些trace,debug等方法
3、日志的发展历史
1) JDK1.3及以前,通过System.(out|err).pringln 打印,存在巨大缺陷。(如没有办法定制化,日志粒度不够细,没有日志级别等)
2) 解析系统打印缺陷问题出现log4j, 2015年8月停止更新
3)受到log4j影响,SUN公司推出java.util.logging即JUL
4)由于存在两个系统实现,解决兼容性问题,推出commons-logging(门面框架),即JCL,但存在一定的缺陷。(对log4J和JUL的配置兼容问题处理的不是很好。)
5)log4j作者推出slf4j(门面框架),功能完善兼容性好,成为业界主流
6)log4j作者在推出log4j后进行新的改进思考推出logback
7) log4j2对log4j的重大升级,修复移植缺陷,极大提升性能
综上所述,最佳组合 slf4j+ logback(springboot使用), slf4j+ log4j2
一般使用logger的方式为
private Logger logger = LoggerFactory.getLogger(MybatisStartTest.class);
进入getLogger
public static Logger getLogger(Class> clazz) {
Logger logger = getLogger(clazz.getName());
if(DETECT_LOGGER_NAME_MISMATCH) {
Class> autoComputedCallingClass = Util.getCallingClass();
if(autoComputedCallingClass != null && nonMatchingClasses(clazz, autoComputedCallingClass)) {
Util.report(String.format("Detected logger name mismatch. Given name: \"%s\"; computed name: \"%s\".", new Object[]{logger.getName(), autoComputedCallingClass.getName()}));
Util.report("See http://www.slf4j.org/codes.html#loggerNameMismatch for an explanation");
}
}
return logger;
}
1、进入getLogger(clazz.getName());
public static Logger getLogger(String name) {
ILoggerFactory iLoggerFactory = getILoggerFactory();
return iLoggerFactory.getLogger(name);
}
2、进入getILoggerFactory
3、进入performInitialization方法
4、 进入bind方法
7. 如果存在多个日志框架打印提示及选择
5、然后进入findPossibleStaticLoggerBinderPathSet方法。获得StaticLoggerBinder所在jar包路径
6、将路径增加到staticLoggerBinderPathSet集合中。
这个就是log的寻址过程。
8、StaticLoggerBinder 这个类存在于logback中,通过这个类获得日志工厂再得实现。