前言
前面将Mybatis的核心配置文件的标签了解了一遍
工欲善其事必先利其器
其实,很多时候都被找BUG折磨着,学会使用日志,是一个很好的习惯
Setting 日志
在Mybatis中,设置好了日志选项,就在settings标签中
一共提供了SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
7种选项
我们只需要学会LOG4J 、STDOUT_LOGGING 即可
日志而已,没必要学那么详细,我们看重的是日志打印出的信息
STDOUT_LOGGING
还是上次的案例Mybatis - 概述与入门
就是一个User(id,name,pwd)表,对该表增删改查
在核心配置文件mybatis-config.xml中配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--核心配置文件-->
<configuration>
<!--引入外部配置文件:优先使用外部文件-->
<properties resource="db.properties"/>
<settings>
<!--标准的日志工厂实现-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--给实体类型别名-->
<typeAliases>
<!--自动扫描包,实体类别名为类名大小写,如果有注解即为注解名-->
<package name="com.learn.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED" >
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--每一个mapper.xml都需要在mybatis的核心配置文件注册-->
<mappers>
<!--将包内的映射器接口实现全部注册为映射器-->
<package name="com.learn.dao"/>
</mappers>
</configuration>
再去运行查询方法:
@Test
public void getUseList(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUserList();
for (User user : users ){
System.out.println(user);
}
sqlSession.close();
}
会发现控制台多了很多信息
这些可以帮助我们更好的了解Mybatis的运作
解读一下上面的信息:
- 读取Mapper
- 打开、创建连接Connection
- 运行sql语句(控制台甚至打印出了sql及运行过程,这对我们的检测错误是很有帮助的,后面的动态sql的查错就需要显示sql运行)
- 输出结果
- 提交事务(select不需要)
- 关闭JDBC Connection
是不是就是我们JDBC的流程,Mybatis是封装了JDBC的
STDOUT_LOGGING 是标准日志输出,已经够用了,但是还可以对日志进行优化:比如对于info信息不打印等要求
就可以使用Log4j或者Log4j2(Log4j2是Log4j的升级版)
Log4J
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;
我们也可以控制每一条日志的输出格式;
通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码
Log4J是一种优秀的日志操作包
如果想用Log4j,需要先导包
Maven配置,或者直接导包(建议使用Maven管理工具,十分方便)
<dependencies>
<!--log4j配置-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
然后把setting改一下(全要大写,别瞎写)
<settings>
<!--标准的日志工厂实现-->
<setting name="logImpl" value="LOG4J"/>
</settings>
但是可以发现,它把信息都放到一个文件里了,并没有显示
我们可以设置一个日志控制文件log4j.properties
对于输出到哪,可以根据需求选择
### 配置根 ###
log4j.rootLogger = debug,console ,fileAppender,dailyRollingFile,ROLLING_FILE,MAIL,DATABASE
### 设置输出sql的级别,其中logger后面的内容全部为jar包中所包含的包名 ###
log4j.logger.org.apache=dubug
log4j.logger.java.sql.Connection=dubug
log4j.logger.java.sql.Statement=dubug
log4j.logger.java.sql.PreparedStatement=dubug
log4j.logger.java.sql.ResultSet=dubug
### 配置输出到控制台 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
### 配置输出到文件 ###
log4j.appender.fileAppender = org.apache.log4j.FileAppender
log4j.appender.fileAppender.File = logs/log.log
log4j.appender.fileAppender.Append = true
log4j.appender.fileAppender.Threshold = DEBUG
log4j.appender.fileAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 配置输出到文件,并且每天都创建一个文件 ###
log4j.appender.dailyRollingFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFile.File = logs/log.log
log4j.appender.dailyRollingFile.Append = true
log4j.appender.dailyRollingFile.Threshold = DEBUG
log4j.appender.dailyRollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 配置输出到文件,且大小到达指定尺寸的时候产生一个新的文件 ###
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
### 配置输出到邮件 ###
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@yeqiangwei.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@yeqiangwei.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
### 配置输出到数据库 ###
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
其实留下输出到控制台和文件就够了
在运行程序一次:
会多出一个log文件夹:error.log和log.log
控制台会显示debug信息(debug<info<warn<Error<Fatal)
日志对象
Log4J提供了一个日志对象,可以修改日志输出的样式
在Test类中定义:
public class myTest {
//日志对象,参数为当前类的class
private Logger logger = Logger.getLogger(myTest.class);
@Test
public void getUseList(){
//日志工厂实现
logger.debug("Debug:进入了getUseList方法");
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUserList();
for (User user : users ){
System.out.println(user);
}
sqlSession.close();
}
往debug信息上加上一行输出
当然,日志对象和一些日志文件的配置还有挺多细节的,这里就不深究了
总结
一切看自己的意愿,日志只是辅助我们的工具
说实话,我比较喜欢 STDOUT_LOGGING ,简单又好用
当然,如果系统复杂,需要筛选信息还是log4j好用
其他的日志工具其实也挺好用,看自己的选择
学海无涯苦作舟
都看到这了,点个赞呗(^_−)☆