为什么要用日志?
我们以前要看一个信息,一般使用的是 System.out.println 来打印的,额,这种方式比较 low,需要在代码里各种写 System.out.println,是会受到鄙视的。。。
使用日志框架的好处:
0、比起 System.out.println,日志框架可以把日志的输出和代码分离;
1、日志框架可以方便的定义日志的输出环境,控制台,文件,数据库,相比 System.out.println 只能输出到控制台要好很多;
2、日志框架可以方便的定义日志的输出格式和输出级别,也就是说我们想看哪个级别的日志就开启哪个级别的日志;
常见的日志框架:
0、JDK logging:JDK 1.4 版本以后开始提供的一个自带的日志库实现,比较弱,功能简单,不支持占位符显示,拓展性差,一般不用;
1、Apache 的 Commons Logging:严格上说,Commons Logging 是日志的一种规范,一种接口,被 Apache 给定义了,日志的规范本身不提供实现,可以通过动态查找的机制去找出真正的日志框架实现库;
2、Log4j:Apache 下功能强大的日志库实现,可以把日志输出到文件,控制台,还可以允许自定义日志格式和日志等级,帮助开发者全方位的掌控日志信息;
3、Log4j 2:是 Log4j 的升级,但是二者之间没有本质关系,基本上把 Log4j 版本的核心全部重构,而且基于 Log4j 做了很多的优化和升级。
4、SLF4J:本质也是日志的规范,出现的比较晚,很多之前的日志技术就没有来遵循它,所有得自己提供其他日志技术框架的桥梁,也就是说使用时得拷贝整合包(比如使用 Log4j 的时候,要遵循 SLF4j 的规范,就需要如图中的 Slf4j-log4j12-xx.jar 包)。
这里有个小故事:
当年 Apache 说服 Log4j 以及其他的日志框架按照 Commons-Logging 的标准来编写,但是由于 Commons-Logging 的加载有点问题,实现起来不友好。因此 Log4j 的作者就创作了 SLF4j,也因此与 Commons-Logging 二分天下。
5、Logback:由 Log4j 创始人设计的另一个开源日志组件,也是作为 Log4j 的替代者出现的,速度比 Log4j 高,而且官方是建议和 SLF4j 一起使用。
Logback、SLF4j、Log4j 都是出自同一个人,所有默认对 SLF4j 无缝整合。
日志级别:
从高到底分别是:
ERROR > WARN > INFO > DEBUG > TRACE
如果设置级别为 INFO,则优先级高于等于 INFO 级别(如:INFO、WARN、ERROR)的日志信息将可以被输出,小于该级别的如 DEBUG 和 TRACE 将不被输出。
总结:日志级别越低,输出的日志越详细。
下面,我们参照 Mybatis 官方文档,进行日志框架(Log4j)配置:
0、在 resources 根目录下创建 log4j.properties 文件:
可以看到日志文件的组成有 3 部分:
分别是 root、logger、appender。
root:设置默认的日志输出级别和风格。
logger:设置自定义日志级别和风格。
appender:可以把日志输出到控制台或文件中去。
语法说明:
root 根配置(全局配置)语法:log4j.rootLogger=[level], appenderName, appenderName, …
把指定级别以上的日志信息输出到指定的一个或者多个位置,level:ERROR > WARN > INFO > DEBUG > TRACE
logger 自定义配置,针对不同包、类、方法的日志个性化配置语法: log4j.logger.+包、类、方法名=[level]
appender 日志输出目的地及格式配置语法:log4j.appender.+
1、通过 mybatis-config.xml 全局配置文件进行日志框架配置:
通过查询 Mybatis 官方文档的 XML 配置 -> settings(设置)知道:
设置名为 logImpl,描述为:指定 MyBatis 所用日志的具体实现,未指定时将自动查找,有效值为:SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING。则可配置日志框架。
2、拷贝相应 jar 包,或引入依赖:
配置好后,运行系列上一篇文章中写好的测试用例,可以看到控制台已经可以打印出相应的日志信息:
可以看到控制台输出了 DEBUG 和 TRACE 级别的日志信息,因为我们自定义设置的 Mapper 映射文件对应包下的日志级别为 TRACE,所以会打印出 TRACE 级别以上的日志信息。
最后说一下,在项目中,有时候我们需要跟踪日志,会在代码中自定义类似如下日志:
然后就可以通过设置日志级别来查看对应的信息。
tips:查看官方文档是学习一门新语言最有效的方法。
系列预告:Mybatis 系列 5:OGNL 表达式
关注「阿泽学长」解锁更多干货。