springboot之logback(二):將日誌寫入資料庫
阿新 • • 發佈:2019-02-02
上一節講了標準日誌輸出到檔案中,本節講解將日誌寫入資料庫,最主要的核心類就是DBAppender。
我使用的MySQL資料庫,建立auge_log資料庫,執行以下內容建表。
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;
然後在pom中新增的dbcp的依賴
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
</dependency>
之後在logback.xml中新增寫入資料庫的配置資訊(這裡設定了寫入資料庫的日誌級別為error,root日誌級別為INFO)
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定義日誌檔案的儲存地址 勿在 LogBack 的配置中使用相對路徑--> <property name="LOG_HOME" value="E:/Code/log" /> <!--將日誌寫入檔案的配置資訊在上節中,本節就不展示了,只展示重點配置--> <!-- 彩色日誌 --> <!-- 按照每天生成日誌檔案 --> <!--info--> <!--error appender--> <!-- 將日誌寫入資料庫 --> <appender name="DB-CLASSIC-MYSQL-POOL" class="ch.qos.logback.classic.db.DBAppender"> <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource"> <dataSource class="org.apache.commons.dbcp.BasicDataSource"> <driverClassName>com.mysql.jdbc.Driver</driverClassName> <url>jdbc:mysql://localhost:3306/auge_log?characterEncoding=UTF-8</url> <username>root</username> <password>123456</password> </dataSource> </connectionSource> <!--這裡設定日誌級別為error--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>error</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 日誌輸出級別 TRACE < DEBUG < INFO < WARN < ERROR < FATAL--> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="DAYINFO" /> <appender-ref ref="DAYERROR" /> <appender-ref ref="DB-CLASSIC-MYSQL-POOL" /> </root> </configuration>
示例:
Logger logger = LoggerFactory.getLogger(UserController.class); @RequestMapping("/login") @LogApi(info = "使用者登陸") public String login(String loginName, String password, Model model){ User user = userService.getUserByLogin(loginName,password); if(user==null){ //在此試驗是否寫入資料庫 logger.error("使用者名稱或密碼錯誤,請重新登入"); model.addAttribute("emg","使用者名稱或密碼錯誤,請重新登入"); return "login"; } logger.info("測試info級別是否也能寫入資料庫"); session.setAttribute("user",user); return "index"; }
檢視資料庫記錄如下:
說明配置成功了(只有error才會寫入資料庫)。