今天回归一下后端工作(其实依然跟运维紧密相关)

经过这一阵的工作,已经把项目的基础设置完成的差不多了,接下来就是做集群的日志管理了

后面会继续更新运维笔记的日志部分

今天遇到的问题在于mybatis-plus的日志输出,受教于这篇文章:

spring boot mybatis 关闭 sql打印日志 springboot开启mybatis日志_mob6454cc76bc4a的技术博客_51CTO博客

需要修改日志的初衷在于,我们要做集群日志,需要统一日志的pattern

然而mybatis的这部分日志输出没有按照统一的pattern来,导致有很多日志被处理成了多行,会影响到日志的采集,类似这种

SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@15b67b] was not registered for synchronization because synchronization is not active

JDBC Connection [HikariProxyConnection@6761653 wrapping oracle.jdbc.driver.T4CConnection@1ea226b] will not be managed by Spring

JsqlParserCountOptimize sql=SELECT id,password,address,phone,name,email FROM T_USER_TEST3 WHERE name = ?

==> Preparing: SELECT COUNT(1) FROM T_USER_TEST3 WHERE name = ?

==> Parameters: zhangsan3(String)

<== Columns: COUNT(1)

<== Row: 0
 

因此我也是首先按照引文里说的流程做:

1. 增加如下配置,使得日志组件走slf4j

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl

2. 设置mybatisplus包下的日志级别为DEBUG;

<logger name="com.baomidou.mybatisplus" level="DEBUG" additivity="true">
    <appender-ref ref="console" />
</logger>

但是做完这两步,之前的sql日志并没有预期输出

然后我就继续深挖博文里的内容,发现我们用的数据库和驱动不一样

我用的是mysql的驱动,所有实际执行过程中也会有一些不同

首先是使用StdOutImpl 然后根据断点,可以看到会走到BaseJdbcLogger

且执行的statementLog是StdOutImpl

到这里相信小伙伴们明白了,对于不同的日志impl,底层其实会走不同的处理handler

然后我们把配置改成Slf4jImpl:

mybatis-plus:
  configuration:
    # 使用 SLF4J 实现日志输出
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

继续走段点,可以看到这次走的链路是不太一样的:

看到这里,也就有答案了,如果使用hikara和mysql,我们只要在logback.xml里增加自己包mapper对应的配置就可以了:

<logger name="org.abc.mapper" level="DEBUG" additivity="true">
    <appender-ref ref="console" />
</logger>

添加完,就可以看到sql日志被成功打印了:

但是奇怪,为什么有两条呢

主要是因为我们的additivity设置了true,会导致继承了root以后,打印了两次,改为false即可

<logger name="org.abc.mapper" level="DEBUG" additivity="false">
    <appender-ref ref="console" />
</logger>

到这里,也就完成了sql的日志输出

总结:

如果你跟我一样,用了hikara + mysql,则完成mybatis日志跟随slf4j pattern输出需要两步

1. 在配置里做修改

mybatis-plus:
  configuration:
    # 使用 SLF4J 实现日志输出
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

2.将自己的mapper包添加到logback.xml里

<logger name="org.abc.mapper" level="DEBUG" additivity="false">
    <appender-ref ref="console" />
</logger>
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐