logback 日誌信息持久化

想要把日誌異步保存到數據庫中,首先需要創建一個數據庫,然後創建三張固定的表:

https://github.com/xiaorenwu-dashijie/logback.git

DROP TABLE IF EXISTS `logging_event`;
CREATE TABLE `logging_event` (
  `timestmp` bigint(20) NOT NULL,
  `formatted_message` text NOT NULL,
  `logger_name` varchar(254) NOT NULL,
  `level_string` varchar(254) NOT NULL,
  `thread_name` varchar(254) DEFAULT NULL,
  `reference_flag` smallint(6) DEFAULT NULL,
  `arg0` varchar(1000) DEFAULT NULL,
  `arg1` varchar(1000) DEFAULT NULL,
  `arg2` varchar(1000) DEFAULT NULL,
  `arg3` varchar(1000) DEFAULT NULL,
  `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(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`event_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4874 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for logging_event_exception
-- ----------------------------
DROP TABLE IF EXISTS `logging_event_exception`;
CREATE TABLE `logging_event_exception` (
  `event_id` bigint(20) NOT NULL,
  `i` smallint(6) NOT NULL,
  `trace_line` varchar(254) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`event_id`,`i`),
  CONSTRAINT `logging_event_exception_ibfk_1` FOREIGN KEY (`event_id`) REFERENCES `logging_event` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- ----------------------------
-- Table structure for logging_event_property
-- ----------------------------
DROP TABLE IF EXISTS `logging_event_property`;
CREATE TABLE `logging_event_property` (
  `event_id` bigint(20) NOT NULL,
  `mapped_key` varchar(254) COLLATE utf8_bin NOT NULL,
  `mapped_value` text COLLATE utf8_bin,
  PRIMARY KEY (`event_id`,`mapped_key`),
  CONSTRAINT `logging_event_property_ibfk_1` FOREIGN KEY (`event_id`) REFERENCES `logging_event` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!--定義日誌文件的存儲地址 勿在 LogBack 的配置中使用相對路徑 -->
    <property name="LOG_HOME" value="/home/logs" />
    <!-- 控制檯輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符 -->
            <pattern>%X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{150} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- info日誌 appender  -->  
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">  
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
            <!-- 按天回滾 daily -->  
            <fileNamePattern>${LOG_HOME}//security-info-%d{yyyy-MM-dd}.log</fileNamePattern>  
            <!-- 日誌最大的歷史 60天 -->  
            <maxHistory>60</maxHistory>  
        </rollingPolicy>  
        <encoder>  
            <pattern>%X{ip} %d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>  
        </encoder>  
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印錯誤日誌 -->  
            <level>INFO</level>  
            <onMatch>ACCEPT</onMatch>  
            <onMismatch>DENY</onMismatch>  
        </filter>  
    </appender>
    
     <!-- 出錯日誌 appender  -->  
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">  
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
            <!-- 按天回滾 daily -->  
            <!-- log.dir 在maven profile裏配置 -->  
            <fileNamePattern>${LOG_HOME}//security-error-%d{yyyy-MM-dd}.log</fileNamePattern>  
            <!-- 日誌最大的歷史 60天 -->  
            <maxHistory>60</maxHistory>  
        </rollingPolicy>  
        <encoder>  
            <pattern>%X{ip} %d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>  
        </encoder>  
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印錯誤日誌 -->  
            <level>ERROR</level>  
            <onMatch>ACCEPT</onMatch>  
            <onMismatch>DENY</onMismatch>  
        </filter>  
    </appender>

    <!--日誌異步到數據庫 -->
    <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
            <dataSource class="org.apache.tomcat.jdbc.pool.DataSource">
                <driverClassName>com.mysql.jdbc.Driver</driverClassName>
                <url>jdbc:mysql://**.***.*.**:3306/log_repository?characterEncoding=UTF-8</url>
                <username>*****</username>
                <password>*****</password>
            </dataSource>
        </connectionSource>
    </appender>

    <!-- 將com.logback.test.dao包下debug級別的sql日誌輸出到控制檯和文件中 -->
    <!-- additivity屬性爲false,表示此loger的打印信息不再向上級(root)傳遞;若爲true,則控制檯就會輸出兩遍dao包下的日誌 -->
    <logger name="com.logback.test.dao" level="DEBUG" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>
    <!-- 將com.logback.test包下INFO級別的日誌記錄到數據庫中 -->
    <logger name="com.logback.test" level="INFO" additivity="true">
        <appender-ref ref="DB"/>
    </logger>
    <!-- 將所有包下debug級別的日誌輸出到控制檯和文件中 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="INFO" />
        <appender-ref ref="ERROR"/>
    </root>
</configuration>

在記錄日誌的時候,我們可能有這種需求,對於每個記錄除了知道日誌信息外,也要記錄訪問該系統的IP。

MDC便提供了這個功能,只需要在代碼中添加下面的方法即可

MDC.put("ip", ip);

在配置文件中用下面的方式獲取即可

%X{ip} 

原文地址:https://www.cnblogs.com/java-spring/p/8360109.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章