spring boot mybatis 日志打印配置

关于springboot日志配置的文章挺多的在此不做赘述,可参考博客:

http://tengj.top/2017/04/05/springboot7/

这里我要说的是关于日志打印等级过滤、sql打印的问题:

简单的日志过滤肯定是比较简单的,基于spring,将所有的日志等级过滤、通过同意的配置文件,将本地、测试、生产环境区别开,包括sql的打印。

1. 首先是sql打印的问题,在mybatis中配置logImpl属性

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

    这个属性的值mybatis的已经说明的比较清楚,不知道的可以到mybatis的官网去查看mybatis.xml的配置说明,这个选项给出了如下值:SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING,其中没有对logging支持;比较特殊的一个是STDOUT_LOGGING,如果配置它,会发现控制台除了自己可以控制的log日志之外还会有完整的sql打印出来,原因是属性logImpl=STDOUT_LOGGING时,mybatis在初始化的时候会走一个方法:isDebugEnabled(){return true;}

    我们可以发现,在mybatis底层封装的sql打印是通过system.out.println()来打印的。

    如果logImpl=STDOUT_LOGGING,sql打印不受log过滤,日志显得比较庞大,测试和生产环境都将打印所有的执行sql及其细节,显然这不是好的选择,当然如果是自己的本地可以通过更改logging-config.xml来实现打印所有sql,因为mybatis原生打印出来的sql美观度、可读性是最好的。这里可以根据自己引入的log工具来设置logImpl的值,此时想要看到控制台打印sql详情就需要在配置文件里面设置:level: debug

logging:
  config: classpath:config/xxxx-config.xml
  path: xxx/xxx/xxx
  level: error
  match: ACCEPT #ACCEPT/DENY
  mismatch: ACCEPT
这样便可以同样打印出所有执行过的sql,可读性稍差,如果sql报错,log和mybatis底层都会将sql的错误详情打印出来。

2. 其次是日志过滤配置化

<springProperty scope="context" name="LOG_HOME" source="logging.path"/>
<springProperty scope="context" name="LOG_LEVEL" source="logging.level"/>
<springProperty scope="context" name="LOG_ONMATCH" source="logging.match"/>
<springProperty scope="context" name="LOG_ONMISMATCH" source="logging.mismatch"/>

    需要注意的是,从application.yml中引用属性的时候,必须使用springProperty标签,不然程序会报错,这个标签表示等待spring的配置文件读取后才能加载这里的属性

<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>${LOG_LEVEL}</level>
      <onMatch>${LOG_ONMATCH}</onMatch>
      <onMismatch>${LOG_ONMISMATCH}</onMismatch>
   </filter>
   <Prudent>true</Prudent>
   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>${LOG_HOME}/claim-%d{yyyy-MM-dd}.log</FileNamePattern>
      <MaxHistory>30</MaxHistory>
   </rollingPolicy>
   <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
   </encoder>
   <!--日志文件最大的大小-->
   <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <MaxFileSize>10MB</MaxFileSize>
   </triggeringPolicy>
</appender>

    这里需要注意的是,日志文件的大小限制和每天生成一份日志在这里会有冲突,有了大小限制便无法自动切换到第二点的日志,反复尝试确认是有冲突,这里我认为是存在一个bug,做的不太好

<!-- log输出等级 -->
<root level="${LOG_LEVEL}">
   <appender-ref ref="CONSOLE" />
   <appender-ref ref="FILE" />
</root>

    最后,再次控制控制台和文件中的日志过滤等级。

3. 最后要说的是springboot2.0和1.5版本之间的区别,springboot2.0比1.5扩充了许多东西,许多模块基于架构做出了调整,比如:

server:
  port: 8084
  servlet:
    context-path: /

    原来的context-path是直接跟在server下面的,现在server下面划出servlet层,将context-path放到了servlet下面,logging也发生了改动,但是存在一个bug,如果你是一个springboot1.5的版本改成了2.0,诸如context-path的改动是会直接报错的,但是logging的level属性却没有,还存在原来的方法,但是运行项目的时候会报错:

Failed to bind properties under 'logging.level' to java.util.Map<java.lang.String, java.lang.String>

即使是新建的2.0的项目,按照原来的写法可以通过快捷键键出level属性但是运行会报错......

logging:
  config: classpath:config/logback-config.xml
  pattern:
    level: error
此时应该如此设置。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值