log4j輸出到資料庫(輸出自定義引數、分級儲存)
阿新 • • 發佈:2019-02-09
Log4J日誌輸出到資料庫中,且儲存些使用者自定義的引數,如使用者ID,且配置僅輸出指定級別的日誌。
配置檔案如下:
log4j.rootLogger=DEBUG,logfile,stdout
log4j.logger.SYSTEM = INFO,JDBC
#也可以使用包名或類名,這樣可以用JAVA的class來初始化logger
log4j.logger.com.wallimn.test=INFO,JDBC
#不繼承父appender的配置,如果取消註釋,rootCategory指定的appender將不再輸出
#log4j.additivity.SYSTEM=false
#stdout configure
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold=DEBUG
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d %5p [%c] - %m%n
#logfile configure
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=./wallimn.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern= %d{yyyy MM dd HH:mm:ss} %5p [%c] - %m%n
#JDBC configure
log4j.appender.JDBC=org.apache.log4j.jdbc.JDBCAppender
#此處優先順序高於log4j.logger.SYSTEM指定級別,
log4j.appender.JDBC.Threshold=INFO
log4j.appender.JDBC.driver=oracle.jdbc.driver.OracleDriver
log4j.appender.JDBC.URL=jdbc:oracle:thin:@127.0.0.1:1521:swdb
log4j.appender.JDBC.user=scott
log4j.appender.JDBC.password=tiger
log4j.appender.JDBC.layout=org.apache.log4j.PatternLayout
log4j.appender.JDBC.sql=INSERT INTO XT_SYS_LOG(USERID,LOGTIME,LOGLEVEL,LOGACTION,MESSAGE)VALUES('%X{userId}',sysdate,'%p','%l','%m')
log4j.appender.JDBC.filter.F1=org.apache.log4j.varia.LevelRangeFilter
#只接收ERROR級別的日誌,這是很有用的技術
#這功能在1.2.8版本時,不支援這樣配置,好像僅支援XML方式配置,我試了好多次才發現這個問題
#可多個Filter組合共同限制
log4j.appender.JDBC.filter.F1.levelMin=ERROR
log4j.appender.JDBC.filter.F1.levelMax=ERROR
log4j.appender.JDBC.filter.F1.acceptOnMatch=true
建測試表的SQL:
create table xt_sys_log(
userid number,
logtime date,
logaction varchar2(100),
loglevel varchar2(100),
message varchar2(255));
測試類:
Java程式碼
- package com.wallimn.test;
- import org.apache.log4j.Logger;
- import org.apache.log4j.MDC;
- import junit.framework.TestCase;
- public class Log4JTest extends TestCase {
- public void testLog1(){
- Logger logger = Logger.getLogger("SYSTEM");
- //Logger logger = Logger.getLogger(Log4JTest.class);
- MDC.put("userId", "11");
- logger.fatal("test_fatal");
- logger.error("test_Error");
- logger.warn("test_warn");
- logger.info("test_Info");
- logger.debug("test_debug");
- MDC.remove("userId");
- }
- }
控制檯輸出:
2012-05-12 22:08:01,156 FATAL [SYSTEM] - test_fatal
2012-05-12 22:08:01,156 ERROR [SYSTEM] - test_Error
2012-05-12 22:08:01,421 WARN [SYSTEM] - test_warn
2012-05-12 22:08:01,421 INFO [SYSTEM] - test_Info
資料庫記錄查詢:
SQL> select userid,loglevel,message from xt_sys_log;
USERID LOGLEVEL MESSAGE
---------- -------------------- --------------------
11 ERROR test_Error
注意:僅記錄了一條日誌。