自学内容网 自学内容网

spring boot集成logback到mysql 8

版本信息:

  1. springboot 3.2.4
  2. mysql 8.0.32-debian
  3. 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之后都没有,中间没测
思路:

  1. 手动导入logback 低版本依赖
  2. 移除spring boot starter等其他内含的logback依赖 (maven依赖分析 + pom文件 exclusions)
  3. 导入低版本依赖后去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配置错了也都直接报这个,不会指出实际的问题

解决

检查下面代码配置项

  1. 标签名 :driverClass,url,user,password (好像不同版本,标签名还不太一样,如driverClass和driverClassName,user和username)
  2. :数据库用户名、密码、jdbc:mysql://mysql_ip:端口/数据库名称?useSSL=false
  3. 导入类名(细节处):ch.qos.logback.classic.db.DBAppender, ch.qos.logback.core.db.DriverManagerConnectionSource, com.mysql.cj.jdbc.Driver (如果有dataSource标签也记得检查class)
  4. 引用对应正确: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>

原文地址:https://blog.csdn.net/weixin_39369688/article/details/137701544

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!