日积月累,方成大器各大网站:,我来为大家科普一下关于mybatis配置过程?下面希望有你要的答案,我们一起来看看吧!

mybatis配置过程(MyBatis系列-2-日志配置)

mybatis配置过程

日积月累,方成大器。

各大网站:

Mybatis官方技术文档 http://mybatis.org/mybatis-3/zh/index.html Mybatis源码包下载:http://github.com/mybatis/mybatis-3/releases 所有代码及笔记gitee路径:http://gitee.com/simple-coding/all-demo-code.git

一、关于Mybatis开发

要使用Mybatis开发只需引入mybatis-x.x.x.jar即可,想其它的日志等,如果需要可以另外引入包进行扩展。

本案例使用最新版本:mybatis-3.5.9.jar

二、日志配置

如果我们不引入第三方的日志包,那mybatis就不能对日志进行输出了吗?

首先,要知道Mybatis不引入第三方日志包,也能进行日志输出(默认日志功能禁用),只不过只能进行控制台输出,不能进行文件输出;另外,对于第三方日志,mybatis有特定的加载顺序,如果引入了多个日志实现也可以在主配置中通过settings进行配置,告诉mybatis我要用哪个进行输出。

最新版本,第三方加载顺序如下、源码如下图(不同的mybatis版本可能不一样):

  • slf4j

  • apache Commons Logging

  • log4j 2

  • Log4j (deprecated since 3.5.9)

  • jdk logging

    MyBatis 内置日志工厂基于运行时自省机制选择合适的日志工具。它会使用第一个查找得到的工具(按上文列举的顺序查找)。如果一个都未找到,日志功能就会被禁用。

    Mybatis日志加载顺序

    三、Mybatis支持哪些日志

    Mybatis支持哪些日志的配置,那就要看我们的主配置文件中settings配置了,配置如下

    日志实现指定

    说白了就是支持常用实现JUL(java util logging)、logback、log4j、log4j2,而SLF4J和COMMONS_LOGGING其实就是日志门面技术,也就是接口。关于日志框架我们后续,会单独讲一下。

    四、日志演示1.STDOUT_LOGGING

    STDOUT_LOGGING :是Mybatis内置实现,只做控制台输出。配置只需一步,也不需要引入第三方依赖:

  • 指定settings配置

    <setting name="logImpl" value="STDOUT_LOGGING"/>

  • 效果图

    运行结果

    2.SLF4J

    首先声明SLF4J是日志门面技术,通过一系列中间转换操作,可以适配现有的任何日志技术。本节只做简单的配置实现logback。

  • 引入第三方包

    <!--这个依赖直接包含了 logback-core实现 以及 slf4j-api日志门面的依赖--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency>

  • 指定settings配置

    不配置也行,第三方日志只有一个日志实现的情况下,有默认加载顺序,详见:第二部分、日志配置

    <!--使用logback--> <setting name="logImpl" value="SLF4J"/>

  • 引入logback配置文件:logback.xml

    开启debug级别,用于输出SQL语句。

    <?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <property name="LOG_HOME" value="logs"/> <!-- 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/smifc.log.%d{yyyy-MM-dd}-%i.log</fileNamePattern> <maxFileSize>10MB</maxFileSize> <maxHistory>20</maxHistory> <totalSizeCap>100GB</totalSizeCap> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <!-- 日志输出级别 --> <root level="DEBUG"> <appender-ref ref="STDOUT"/> </root> <root level="DEBUG"> <appender-ref ref="FILE"/> </root> </configuration>

  • 效果图

    logback

    3.JDK_LOGGING

    JDK_LOGGING是个啥?其实它就是JDK自带的日志。也不需要我们引入第三方包。

    jdk自带的日志,配置文件加载有三种方法:1.默认路径【JRE_HOME/lib/logging.properties】;2.自定义加载配置文件路径【java.util.logging.config.file】;3.自定义加载配置类【java.util.logging.config.class】需要通过readConfiguration(InputStream) 实现

    看下JDK源码LogManager加载配置实现:

    JDK源码LogManager加载配置实现

  • 自定义加载配置文件路径【java.util.logging.config.file】实现

    自定义加载路径

  • 引入logging.properties

    handlers=java.util.logging.ConsoleHandler .level=ALL #mapper的命名空间 test=ALL java.util.logging.ConsoleHandler.level=ALL java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter java.util.logging.SimpleFormatter.format=%1$tT.%1$tL %4$s %3$s - %5$s%6$s%n

  • 主配置文件指定日志实现

    <setting name="logImpl" value="JDK_LOGGING"/>

  • 效果图

    运行结果

    4.LOG4J、LOG4J2

    LOG4J(log4j.properties)、LOG4J2(log4j2.xml)这两个实现和logback实现大同小异,直接引入实现jar包,变更主配置实现即可。

  • jar包引入

    引入jar包

  • 主配置配置

    指定日志实现

  • 配置文件

    配置文件

  • 运行结果

    运行结果

    5.COMMONS_LOGGING

    COMMONS_LOGGING (commons-logging.properties)是一个日志门面技术,也就是接口,其自身自带简单实现org.apache.commons.logging.impl.SimpleLog也支持jdk的日志实现。这里我们引入commons-logging包使用其的简单日志实现。

    另外,支持的实现如下:

    //LogFactoryImpl.java private static final String[] classesToDiscover = new String[]{"org.apache.commons.logging.impl.Log4JLogger", "org.apache.commons.logging.impl.Jdk14Logger", "org.apache.commons.logging.impl.Jdk13LumberjackLogger", "org.apache.commons.logging.impl.SimpleLog"};

  • 只引入commons-logging包

    <!--commons-logging--> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency>

  • 定义commons-logging.properties指明使用的日志实现

    org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog

  • 定义simplelog.properties配置日志信息

    org.apache.commons.logging.simplelog.defaultlog=all org.apache.commons.logging.simplelog.log.test=all org.apache.commons.logging.simplelog.showlogname=true org.apache.commons.logging.simplelog.showShortLogname=true org.apache.commons.logging.simplelog.showdatetime=true org.apache.commons.logging.simplelog.dateTimeFormat=yyyy-MM-dd hh:mm:ss

  • 主配置指定实现

    <!--使用COMMONS_LOGGING简单日志--> <setting name="logImpl" value="COMMONS_LOGGING"/>

  • 效果

    运行结果

    五、总结

    在以上的日志配置中,我引入了所有的日志实现,通过控制主配置文件中配置

    <setting name="logImpl" value="XXX"/>

    达到,具体要使用哪个的目的。如果整合Mybatis时有多个日志实现,可通过此配置控制。