1. 程式人生 > >springboot之logback(二):將日誌寫入資料庫

springboot之logback(二):將日誌寫入資料庫

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