前言

springboot默认配置提供了对常用日志的支持,如Java Util Logging,Log4J, Log4J2和Logback,本文主要讲解springboot默认使用的日志logback配置文件该如何配置,以及代码中如何使用日志,以及如何输出mybatis的sql日志。

正文

springboot对logback已经提供了默认的配置,所以要使用logback非常简单,只需要在resources目录下新建一个名为logback.xml的文件,springboot就能读取到改文件中的配置信息,本文使用上一篇文章springboot入门(三)– springboot集成mybatis及mybatis generator工具使用的例子代码,去掉多余的dao和entry。
在resources目录下创建logback.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="log.home" value="D:\\logs" />

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
    <!-- Console 输出设置 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 文件保存日志的相关配置 ERROR -->
    <appender name="ERROR-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 保存日志文件的路径 -->
        <!--<file>D:/logs/error/error.log</file>-->
        <!-- 日志格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%class:%line] - %m%n</pattern>
        </encoder>
        <!-- 日志级别过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.home}/error/%d{yyyy-MM-dd}-error.log</fileNamePattern>
            <!-- 最大保存时间:30天-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <!-- 日志文件最大大小 -->
            <MaxFileSize>100MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 文件保存日志的相关配置 INFO -->
    <appender name="INFO-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 保存日志文件的路径 -->
        <!--<file>D:/logs/info/info.log</file>-->
        <!-- 日志格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%class:%line] - %m%n</pattern>
        </encoder>
        <!-- 日志级别过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.home}/info/%d{yyyy-MM-dd}-info.log</fileNamePattern>
            <!-- 最大保存时间:30天-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <!-- 日志文件最大大小 -->
            <MaxFileSize>100MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 输出mybatis的sql语句,没有这句就无法输出mybatis的sql语句,name属性指定到要输出日志的dao,即mybatis要代理的dao -->
    <logger name="com.cuit.springboot.dao" level="DEBUG" />

    <!-- 基于info处理日志:具体控制台或者文件对日志级别的处理还要看所在appender配置的filter,如果没有配置filter,则使用root配置 -->
    <root level="info">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="INFO-OUT" />
        <appender-ref ref="ERROR-OUT" />
    </root>
</configuration>

关于logback的配置文件,在<configuration>标签下每个<appender>表示一种日志输出格式,比如上面的配置文件定义了三个appender,第一个appender名为STDOUT定义了控制台输出格式;第二个appender名为ERROR-OUT在其子标签中通过filter标签定义了只接收error级别的日志,并且日志将按照rollingPolicy标签定义的策略生成在指定的文件(包含目录)中,而日志在文件中的输出格式则由encoder中的正则来控制;第三个appender名为INFO-OUT同理在指定文件夹下生成对应的日志文件并且只接受记录info级别的日志。三个appender定义好之后,最后在root标签中通过<appender-ref ref="***" />
子标签来启用三个appender,关于root的level的意思是,如果appender中没有通过<encoder>标签来指定日志的过滤级别,就使用level中定义的级别,上面的三个appender中由于控制台的appender没有使用<encoder>标签定义过滤级别,所以使用level中指定的info级别(即只会在控制台中输出大于等于info级别的日志),而在另外两个输出到文件的日志由于使用了<encoder>标签来指定对应的日志过滤规则,所以就不使用level中定义的级别。
使用上面的配置启动程序,调用一下查询,就可以看到在控制台中输出了mybatis查询的sql语句,并且,在D://logs/info和D://logs/error文件夹下已经生成了对应的日志文件。