1 摘要

logback 作为SpringBoot 默认日志记录框架,足以见得其技术地位。很多人随便从网上找一个 logback 的配置文件,但是多少有一些使用不便的地方,作为一个对代码有洁癖的开发者,作者自己折腾了一个既优雅又实用的 logback 日志配置模板。

logback 官方文档:

http://logback.qos.ch/documentation.html

2 完整配置文件

废话不多说,先上配置文件

./web/src/main/resources/logback.xml
<?xml version="1.0" encoding="UTF-8"?>

<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 属性定义 -->
    <property name="LOG_HOME" value="../../logs/stock-alert" />
    <property name="maxHistory" value="90" />
    <property name="CONSOLE_LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss} | %highlight(%-5level) | %boldYellow(%thread) | %boldGreen(%logger{100} %L\)| %msg%n"/>
    <property name="FILE_LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss} | %-5level | %thread | %logger{100} %L\ | %msg%n" />

    <!-- ConsoleAppender 控制台输出日志 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 对日志进行格式化 -->
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- INFO级别日志 -->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 过滤器,记录「INFO」及以上级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/info/infoLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>${maxHistory}</maxHistory>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- ERROR级别日志 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 过滤器,只记录「ERROR」级别的日志 -->
        <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.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/error/errorLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>${maxHistory}</maxHistory>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- eg: com.ljq.test 类的日志输出 info 及以上级别的日志 -->
    <!--<logger name="com.ljq.test" level="info" />-->
    <!-- eg: com.ljq.test1 类的日志不输出 -->
    <!--<logger name="com.ljq.test1" additivity="false" />-->
    <logger name="org.apache.ibatis.io" level="info" />
    <logger name="org.mybatis.spring" level="info" />
    <logger name="com.baomidou.mybatisplus.core.MybatisConfiguration" level="info" />
    <logger name="com.baomidou.mybatisplus.extension" level="info" />
    <logger name="org.hibernate.validator" level="info" />
    <logger name="org.apache.http" level="warn" />
    <logger name="com.zaxxer.hikari" level="info" />

    <logger name="org.springframework" level="info" />
    <logger name="_org.springframework" level="info" />

    <logger name="springfox" level="info" />
    <logger name="io.springfox" level="info" />
    <logger name="io.swagger" level="info" />

    <logger name="io.lettuce" level="info" />
    <logger name="io.netty" level="info" />

    <!-- 根日志,所有日志appender都必须包含在root/logger中,否则不会起作用 -->
    <root level="debug">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="INFO" />
        <appender-ref ref="ERROR" />
    </root>
</configuration>

3 配置说明

3.1 怎么个优雅法
<property name="CONSOLE_LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss} | %highlight(%-5level) | %boldYellow(%thread) | %boldGreen(%logger{100} %L\)| %msg%n"/>
<property name="FILE_LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss} | %-5level | %thread | %logger{100} %L\ | %msg%n" />

这里定义了两种日志输出格式,CONSOLE_LOG_PATTERN 即为控制台输出日志的格式,该配置添加了高亮显示,当开发者在调试环境中运行程序的时候,不同的颜色比统一的黑色要看起来舒服多了,而且不同级别的日志颜色不同,也能够快速定位问题。

是否包含高亮显示的对比图

logback-with-color

logback-without-color

3.2 怎么个实用法
  • 作者这里持久化的日志只定义了两种级别,即 info 级别以及 error 级别,简化了文件日志分级,一般情况下这两种级别的日志已经够用了。 info 级别的日志用于记录程序的必要信息,而 error 级别的日志用于记录程序异常信息,方便排查问题。至于 debug 级别的日志,只需要在开发的时候输出到控制台即可,不需要输出的文件中,节约服务器资源。

info 级别日志文件信息(文件日志中是不包含 Mybatis sql 执行过程的,而控制台的日志中是包含的):

logback-file-log

  • info 级别的日志包含了 info 级别及以上的日志,而 error 级别的日志只包含 error 级别的日志。当我们在查看日志信息的时候,可以从 info 级别中查看到完整的日志信息。如果严格按照每一种级别的日志都单独存储,则排查问题的时候,一个问题还要打开好几个日志文件,从而增加了排查难度。

注意: info 级别的日志等级过滤器和 error 级别的日志等级过滤器不一样

        <!-- 过滤器,记录「INFO」及以上级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <!-- 过滤器,只记录「ERROR」级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
  • 特定类的日志过滤级别设置。一些常用的公共类库在执行的时候会输出很多的日志,这些日志信息会影响开发者排查与定位问题,可以在 logback 中定义日志的输出级别来减少不必要的日志干扰。
<!-- eg: com.ljq.test 类的日志输出 info 及以上级别的日志 -->
    <!--<logger name="com.ljq.test" level="info" />-->
    <!-- eg: com.ljq.test1 类的日志不输出 -->
    <!--<logger name="com.ljq.test1" additivity="false" />-->
    <logger name="org.apache.ibatis.io" level="info" />
    <logger name="org.mybatis.spring" level="info" />
    <logger name="com.baomidou.mybatisplus.core.MybatisConfiguration" level="info" />
    <logger name="com.baomidou.mybatisplus.extension" level="info" />
    <logger name="org.hibernate.validator" level="info" />
    <logger name="org.apache.http" level="warn" />
    <logger name="com.zaxxer.hikari" level="info" />

4 推荐参考资料

logback 官方文档

Logback中如何自定义灵活的日志过滤规则

5 Github 源码

Gtihub 源码地址 : https://github.com/Flying9001/springBootDemo

个人公众号:404Code,分享半个互联网人的技术与思考,感兴趣的可以关注.
404Code

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐