spring boot集成logback到mysql 8
版本信息:
- springboot 3.2.4
- mysql 8.0.32-debian
- logback-classic:1.4.14
依赖
<!--logback 的依赖 springboot的starter已经包含了,所以不需要导入,如果不是springboot就导入下 -->
<!--
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.14</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.4.14</version>
</dependency>
-->
<!-- https://mvnrepository.com/artifact/ch.qos.logback.db/logback-classic-db -->
<!--如果要保存到数据库就需要以下依赖,不然会报没有DBAppender 的bug -->
<dependency>
<groupId>ch.qos.logback.db</groupId>
<artifactId>logback-classic-db</artifactId>
<version>1.2.11.1</version>
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
数据库准备
创建log日志用户,并创建数据库
create user 'log'@'%' identified by '密码';
grant all on log.* to 'log'@'%';
select * from mysql.user; # 查看用户创建结果
create database log default charset utf8mb4; # 创建数据库
执行建表sql
到 logback-classic-db jar包 依赖下找到 建表sql,按照你的数据库框架选一个,如 mysql,选择如下:
tips:可以看到上图是有DBAppender这个类的,logback 高版本已经移除该类,所以才需要logback-classic-db 这个额外依赖
执行sql文件 :mysql.sql
配置文件
名称固定:logback-spring.xml
位置:classpath下都行,我放resources下
tip:logback-spring.xml 和 logback.xml 的区别:加载时机
- logback-spring.xml:spring初始化完成后,所以可以使用spring的变量和bean之类的对象
- logback.xml:spring 初始化之前,所以用不了spring的变量等
<configuration>
<!-- 输出日志到数据库 -->
<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<driverClass>com.mysql.cj.jdbc.Driver</driverClass>
<url>jdbc:mysql://mysql_ip:端口/数据库名称?useSSL=false</url>
<user>xxx</user>
<password>xxx</password>
</connectionSource>
</appender>
<root level="INFO">
<appender-ref ref="DB" />
</root>
</configuration>
启动项目即可,日志已经导入msyql
bug
bug 1:Failed to instantiate type ch.qos.logback.classic.db.DBAppender
bug信息:
Logging system failed to initialize using configuration from 'null'
java.lang.IllegalStateException: Logback configuration error detected:
ERROR in ch.qos.logback.core.model.processor.AppenderModelHandler - Could not create an Appender of type [ch.qos.logback.classic.db.DBAppender]. ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type ch.qos.logback.classic.db.DBAppender
ERROR in ch.qos.logback.core.model.processor.DefaultProcessor@5f172d4a - Failed to traverse model appender ch.qos.logback.core.model.processor.ModelHandlerException: ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type ch.qos.logback.classic.db.DBAppender
at org.springframework.boot.logging.logback.LogbackLoggingSystem.reportConfigurationErrorsIfNecessary(LogbackLoggingSystem.java:277)
at org.springf
原因:没有DBAppender 或者 JDBCAppender之类的,logback高版本移除数据库保存的依赖问题
解决:
tips:解决后记得把sql 数据库删了重建,防止logback不同版本导致sql 表结构不同
1、导入缺失的依赖(推荐)
<!-- https://mvnrepository.com/artifact/ch.qos.logback.db/logback-classic-db -->
<!--如果要保存到数据库就需要以下依赖,不然会报没有DBAppender 的bug -->
<dependency>
<groupId>ch.qos.logback.db</groupId>
<artifactId>logback-classic-db</artifactId>
<version>1.2.11.1</version>
</dependency>
思路:到maven 仓库查找 DBAppender 或者 JDBCAppender的依赖,然后加入pom文件,或者直接下载jar依赖,保存到对应本地仓库位置(pom下载失败的时候)
2、降低logback版本(不推荐)
tips:logback-classic 1.2.3存在DBAppender 类,1.2.11之后都没有,中间没测
思路:
- 手动导入logback 低版本依赖
- 移除spring boot starter等其他内含的logback依赖 (maven依赖分析 + pom文件 exclusions)
- 导入低版本依赖后去jar包下检查是否存在 DBAppender类或者JDBCAppender类,确认该版本可用
bug2: DBAppender cannot function if the JDBC driver does not support getGeneratedKeys method and without a specific SQL dialect
bug信息
Logging system failed to initialize using configuration from 'null'
java.lang.IllegalStateException: Could not initialize Logback logging from classpath:logback-spring.xml
...
...
Caused by: java.lang.IllegalStateException: DBAppender cannot function if the JDBC driver does not support getGeneratedKeys method *and* without a specific SQL dialect
...
原因
虚假原因(坑):数据库依赖不支持自增主键功能,或者没有指定sql方言
实际原因:logback-spring.xml 文件中 数据库配置有问题
神坑:该bug只要数据库连接配置有问题,哪怕class配置错了也都直接报这个,不会指出实际的问题
解决
检查下面代码配置项
- 标签名 :driverClass,url,user,password (好像不同版本,标签名还不太一样,如driverClass和driverClassName,user和username)
- 值:数据库用户名、密码、jdbc:mysql://mysql_ip:端口/数据库名称?useSSL=false
- 导入类名(细节处):ch.qos.logback.classic.db.DBAppender, ch.qos.logback.core.db.DriverManagerConnectionSource, com.mysql.cj.jdbc.Driver (如果有dataSource标签也记得检查class)
- 引用对应正确:appender-ref ref=“DB” 和 appender name=“DB”
<configuration>
<!-- 输出日志到数据库 -->
<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<driverClass>com.mysql.cj.jdbc.Driver</driverClass>
<url>jdbc:mysql://mysql_ip:端口/数据库名称?useSSL=false</url>
<user>xxx</user>
<password>xxx</password>
</connectionSource>
</appender>
<root level="INFO">
<appender-ref ref="DB" />
</root>
</configuration>