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&useUnicode=true&characterEncoding=utf-8&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&useUnicode=true&characterEncoding=utf-8&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. 插入數據庫數據
總結
以上是生活随笔為你收集整理的012_logback中的DBAppender的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 011_logback中的SMTPApp
- 下一篇: 001_消息中间件
