logback日志记录到数据库,使用DataSourceConnectionSource、Hikari数据源(默认)

整理思路(不感兴趣直接看准备工作)

由于我这里是web应用,自带了logback和hikari的依赖,不需要修改pom,如果不自带需要自行安装。

1.需要采用DBAppender方式去操作数据库,配置 DBAppender 的主要问题在于如何设置 ConnectionSource 实例,ConnectionSource 实例配置完成之后,配合需要的那三张表logging_event, logging_event_property 与 logging_event_exception,logback就会自动插库。

2.ConnectionSource其实相当于做一个再封装的数据源,让logback去操作,ConnectionSource 目前有三种实现,分别为:DataSourceConnectionSource, DriverManagerConnectionSourceJNDIConnectionSource,这里使用的是DataSourceConnectionSource方式+Hikari数据源

文档在这里:第四章:Appenders - logback

准备工作:

1.记录日志到数据库需要三个表,建表脚本网上很好找,外部库logback-classic/src/main/java/ch/qos/logback/classic/db/script 中也有,(我这里使用的是mysql)在数据源中执行一下,看到三个表就ok;

2.配置文件logback-spring.xml,数据源配置按照实际情况改一下,其他配置直接copy

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration  scan="true" scanPeriod="10 seconds">
    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="D:/log/" />
    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>


    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="DB-CLASSIC-MYSQL-POOL" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
            <dataSource class="com.zaxxer.hikari.HikariDataSource">
<!--   这里是不需要设置驱动的,设置了反而会报错             <driverClass>com.mysql.jdbc.Driver</driverClass>-->
                <jdbcUrl>数据源url(jdbc:mysql://...这种格式)</jdbcUrl>
                <username>登录名</username>
                <password>密码</password>
            </dataSource>
        </connectionSource>
        <!--
            自定义日志过滤实现类,继承Filter<ILoggingEvent>或者TurboFilter重写decide方法
            Filter实现的过滤器是与Appender绑定的,而TurboFIlter是与日志上下文绑定的,会过滤所有的日志请求,并且TurboFIlter的方法中提供了丰富的可访问信息用来进行控制和改写。
        常规过滤器Filter位置:位于appender内。常规过滤器用<filter>标签,是<appender>的子标签。
        TurboFilter过滤器位置:位于configuration内。TurboFilter过滤器用<turboFilter>标签,是<configuration>子标签。
          TurboFilter对于解决应用程序中因为框架的叠加,且对接了日志告警的情况下,若出现一个错误产生重复告警的现象有很好的效果,可以在全局进行动态的日志修改。
            返回值有三种类型
            FilterReply.ACCEPT   记录事件立即被处理,不经过下个记录器
            FilterReply.NEUTRAL      下一个记录器接着处理
            FilterReply.DENY      记录时事件被立即被抛弃
        -->
<!--        <filter class="com.xxxxx.xxxxx.LogsFilter" />-->
    </appender>
    <!--开发环境:打印控制台-->
    <springProfile name="dev">
        <logger name="com.nmys.view" level="debug"/>
    </springProfile>

    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="DB-CLASSIC-MYSQL-POOL" />
    </root>
</configuration>

 配置文件需要在application.properties加一行中引入,文件路径按照实际的来

logging.config=classpath:config/logback-spring.xml

使用方式(这里是在controller里面调的,其他也可以)

@RestController
@Api(tags = "测试接口")
public class testController {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @GetMapping(value = "/test")
    @ApiOperation(value = "测试", notes = "列表信息")
    public Response test() {
        logger.debug("This is a debug message");//注意 spring 默认日志输出级别为 info 所以默认情况下 这句不会打印到控制台
        logger.info("This is an info message");
        logger.warn("This is a warn message");
        logger.error("This is an error message");
        return Response.success(200, null, "测试成功");
    }
}

请求一下这个接口,查看数据库和控制台,在这里打印的是info及以上的,如果感觉东西太多可以在logback配置文件改成warn及以上的

以上,如有错误,欢迎指正

以下是使用logback日志数据写入mysql数据库的示例代码: 1. 添加依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> ``` 2. 配置logback.xml文件 在src/main/resources目录下创建logback.xml文件,并添加以下配置: ``` <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://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai</url> <user>root</user> <password>123456</password> </connectionSource> <sqlDialect class="ch.qos.logback.core.db.dialect.MySQLDialect"/> <insertHeaders>true</insertHeaders> <bufferSize>1</bufferSize> <tableName>log</tableName> <columnMapping> <column name="timestamp" isTimestamp="true"/> <column name="level" pattern="%level"/> <column name="logger" pattern="%logger"/> <column name="message" pattern="%message"/> </columnMapping> </appender> <root level="info"> <appender-ref ref="DB"/> </root> </configuration> ``` 其中,url、user和password需要根据实际情况修改。 3. 编写测试代码 在Spring Boot应用程序中,可以使用LoggerFactory获取Logger实例,并使用Logger实例记录日志。例如: ``` @RestController public class TestController { private static final Logger logger = LoggerFactory.getLogger(TestController.class); @GetMapping("/test") public String test() { logger.info("This is a test log message."); return "success"; } } ``` 4. 运行测试 启动Spring Boot应用程序,并访问http://localhost:8080/test,可以在mysql数据库中查看到日志数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值