上一節講了標準日誌輸出到文件中,本節講解將日誌寫入數據庫,最主要的核心類就是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纔會寫入數據庫)。