日志工厂
Mybatis 通过使用内置的日志工厂提供日志功能。内置日志工厂将会把日志工作委托给下面的实现之一:
- SLF4J
- Apache Commons Logging
- Log4j 2
- Log4j (3.5.9 起废弃)
- JDK logging
MyBatis 内置日志工厂基于运行时自省机制选择合适的日志工具。它会使用第一个查找得到的工具(按上文列举的顺序查找)。如果一个都未找到,日志功能就会被禁用。
思考为什么要使用日志?
1、我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率?
2、如果一个 数据库相关的操作出现了问题,我们可以根据输出的SQL语句快速排查问题。
3、以往我们查看某个方法是否执行了或者想知道某个变量是否被成功赋值了经常用到debug的方式来跟踪,但是现在使用Mybatis是基于接口,配置文件的源代码执行过程。因此,我们必须选择日志工具来作为我们开发,调节程序的工具。
标准日志实现
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
value 可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING
这里要注意:单词不要写错!后面不能有空格!
明显发现多了很多东西,更加清晰,排错将变得简单!
Log4j配置示例
简介:
- Log4J 是 Apache 的一个开源项目(官网 http://jakarta.apache.org/log4j)
- 通过在项目中使用 Log4J,我们可以控制日志信息输出到控制台、文件、GUI 组件、甚至是数据库中。
- 我们可以控制每一条日志的输出格式
- 通过定义日志的输出级别,可以更灵活的控制日志的输出过程。方便项目的调试。
组成:
Log4J 主要由 Loggers (日志记录器)、Appenders(输出端)和 Layout(日志格式化器)组成。其中 Loggers 控制日志的输出级别与日志是否输出;Appenders 指定日志的输出方式(输出到控制台、文件等);Layout 控制日志信息的输出格式。
日志级别:
log4j定义了8个级别的log:
DEBUG INFO WARN ERROR FATAL ALL OFF TRACE
Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。
如果log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来,就拿我们常用的4个等级ERROR、WARN、INFO、DEBUG,如果我们设置在INFO上,那程序中所有DEBUG级别的日志将不会打印。
常用几个等级的说明:
1、DEBUG 指定细粒度信息事件是最有用的应用程序调试,一般使用log.debug()进行跟踪调试。
2、INFO 指定能够突出在粗粒度级别的应用程序运行情况的信息的消息,就是输出提示信息。info级别监控系统运行情况,可以帮助程序员有效的了解程序的流转。
3、WARN 指定具有潜在危害的情况,一般很少使用。
4、ERROR 错误事件可能仍然允许应用程序继续运行。就是显示错误信息。比如接口访问超时,用try/catch 捕获异常,发生异常的时候log.error输出错误信息,并不影响程序的运行。
Appender(输出端)
Appender 用来指定日志输出到哪个地方,可以同时指定日志的输出目的地。Log4j 常用的输出目的地有以下几种:
类型 | 描述 |
---|---|
ConsoleAppender | 将日志输出到控制台 |
FileAppender | 将日志输出到文件中 |
DailyRollingFileAppender | 将日志输出到一个日志文件,并且每天输出到一个新的文件 |
RollingFileAppender | 将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大 小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件 |
JDBCAppender | 把日志信息保存到数据库中 |
Layout(日志格式化器)
类型 | 描述 |
---|---|
HTMLLayout | 格式化日志输出为HTML表格形式 |
SimpleLayout | 简单的日志输出格式化,打印的日志格式为(info - message) |
PatternLayout | 最强大的格式化期,可以根据自定义格式输出日志,如果没有指定转换格式,就是用默认的转换格式 |
快速入门
1、导入log4j 的依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2、配置文件编写
resource目录下创建log4j.properties
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
3、setting设置日志实现
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
4、在程序中使用Log4j进行输出!
//注意导包:org.apache.log4j.Logger
static Logger logger = Logger.getLogger(MyTest.class);
@Test
public void selectUser() {
logger.info("info:进入selectUser方法");
logger.debug("debug:进入selectUser方法");
logger.error("error: 进入selectUser方法");
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.selectUser();
for (User user: users){
System.out.println(user);
}
session.close();
}
在项目目录下log文件夹下生成了一个 .log 文件