012_logback中的DBAppender

1. DBAppender把记录事件写入数据库的三张表。三张表分别是logging_event、logging_event_property和logging_event_exception。在使用DBAppender之前, 这三张表必须已经被创建。Logback提供创建这些表的SQL脚本, 位于logback-classic/src/main/java/ch/qos/logback/classic/db/script目录, 对各个流行数据库分别有一个脚本。如果没有你想用的数据库的脚本, 那就按照现有的脚本自己写吧。

2. 创建表

2.1. logback提供的mysql.sql

2.2. logback提供的创建mysql数据库表代码

BEGIN;
DROP TABLE IF EXISTS logging_event_property;
DROP TABLE IF EXISTS logging_event_exception;
DROP TABLE IF EXISTS logging_event;
COMMIT;

BEGIN;
CREATE TABLE logging_event 
  (
    timestmp         BIGINT NOT NULL,
    formatted_message  TEXT NOT NULL,
    logger_name       VARCHAR(254) NOT NULL,
    level_string      VARCHAR(254) NOT NULL,
    thread_name       VARCHAR(254),
    reference_flag    SMALLINT,
    arg0              VARCHAR(254),
    arg1              VARCHAR(254),
    arg2              VARCHAR(254),
    arg3              VARCHAR(254),
    caller_filename   VARCHAR(254) NOT NULL,
    caller_class      VARCHAR(254) NOT NULL,
    caller_method     VARCHAR(254) NOT NULL,
    caller_line       CHAR(4) NOT NULL,
    event_id          BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY
  );
COMMIT;

BEGIN;
CREATE TABLE logging_event_property
  (
    event_id	      BIGINT NOT NULL,
    mapped_key        VARCHAR(254) NOT NULL,
    mapped_value      TEXT,
    PRIMARY KEY(event_id, mapped_key),
    FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
  );
COMMIT;

BEGIN;
CREATE TABLE logging_event_exception
  (
    event_id         BIGINT NOT NULL,
    i                SMALLINT NOT NULL,
    trace_line       VARCHAR(254) NOT NULL,
    PRIMARY KEY(event_id, i),
    FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
  );
COMMIT;

2.3. 拷贝sql代码到Navicat编辑器里执行

2.4. 表创建完成

2.5. 表logging_event字段和含义

2.6. 表logging_event_property字段和含义, 用于存储包含在MDC或上下文里的键和值

2.7. 表logging_event_exception字段和含义

3. ConnectionSource接口和派生类

3.1. logback的ConnectionSource接口提供了一种可插拔地、透明地获取JDBC连接的方法。现在有三种具体实现: DataSourceConnectionSource、DriverManagerConnectionSource和JNDIConnectionSource。

3.2. ConnectionSource接口

3.3. DriverManagerConnectionSource是ConnectionSource的一个实现, 以传统的JDBC方式从连接URL里取得连接。

3.4. 注意DriverManagerConnectionSource会在每次调用getConnection()方法时建立一个新连接。

3.5. DriverManagerConnectionSource配置

<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://192.168.25.138:3306/studyjdbc?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai</url>    
		<user>root</user>    
		<password>lyw123456</password>   
	</connectionSource>
</appender>

4. 连接池

4.1. 记录事件有时创建得很快。为了来得及插入数据库, 推荐为DBAppender使用连接池。

4.2. 使用DataSourceConnectionSource可以配置连接池, 推荐使用c3p0。

4.3. 新建一个名为DBAppender的Java项目, 同时添加相关jar包

4.4. 在src目录下编辑loback.xml

<configuration debug="true">

	<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
		</encoder>
	</appender>

	<appender name="db" class="ch.qos.logback.classic.db.DBAppender">
		<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">   
			<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">  
				<driverClass>com.mysql.cj.jdbc.Driver</driverClass>    
				<jdbcUrl>jdbc:mysql://192.168.25.138:3306/studyjdbc?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai</jdbcUrl>    
				<user>root</user>    
				<password>lyw123456</password>
			</dataSource>   
		</connectionSource>
	</appender>

	<root level="debug">
		<appender-ref ref="db" />
		<appender-ref ref="stdout" />
	</root>

</configuration>

4.5. 编辑MyDb.java

package com.zr.mail;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyDb {
	private static final Logger logger = LoggerFactory.getLogger(MyDb.class);
	
	public static void main(String[] args) {
		logger.trace("向数据库写入一个跟踪信息");
		logger.debug("向数据库写入一个测试信息");
		logger.info("向数据库写入一个日志信息");
		logger.warn("向数据库写入一个警告信息");
		logger.error("向数据库写入一个错误信息");
	}
}

4.6. 运行项目

4.7. 插入数据库数据

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值