想要把日誌異步保存到數據庫中,首先需要創建一個數據庫,然後創建三張固定的表:
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}