log4j配置輸出到數據庫+自定義字段


Log4j.properties配置

log4j.rootLogger = info,stdout,D,E,A3

log4j.appender.Threshold=info

 

### 控制台輸出###

log4j.appender.stdout = org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target = System.out

log4j.appender.stdout.layout = org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern = %d{yyyy MMM dd HH\:mm\:ss,SSS}%m%n

 

### DEBUG 文件保存至D://PDFPolling/Log/error.log ###

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender

log4j.appender.D.File = D\://PDFPolling/Log/log.log 

log4j.appender.D.Append = true

log4j.appender.D.Threshold = DEBUG

log4j.appender.D.layout = org.apache.log4j.PatternLayout

log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

 

### ERROR 文件保存至 D://PDFPollingLog/error.log ###

log4j.appender.E = org.apache.log4j.DailyRollingFileAppender

log4j.appender.E.File =D://PDFPolling/Log/error.log

log4j.appender.E.Append = true

log4j.appender.E.Threshold = ERROR

log4j.appender.E.layout = org.apache.log4j.PatternLayout

log4j.appender.E.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss}  [ %t\:%r ] - [ %p ]

 

###保存至數據庫###2017.12.18注釋掉  rootCategory 舊;rootLogger 新=rootCategory的子類

##定義輸出sql語句到控制台,文件,數據庫(僅供樣式參考,實際由於輸出info級別的,此處定義debug無法輸出)

##log4j.rootCategory=ERROR,A3

log4j.logger.Java.sql.Connection=debug

log4j.logger.java.sql.Statement=debug

log4j.logger.java.sql.PreparedStatement=debug,stdout,D,E,A3

##定義sql語句輸入到stdout控制台,DE文件,A3數據庫,sql語句是debug級別的,而一開始定義的rootlogger是info級別的,所以這里其實定義不起什么作用;如果要sql語句輸出到控制台,可以將rootlogger設置為debug級別輸出

 

#定義A3輸出到數據庫

log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender

log4j.appender.A3.URL=jdbc\:sqlserver\://127.0.0.1\:53565;DatabaseName\=PDFP

log4j.appender.A3.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver

log4j.appender.A3.user=sa

log4j.appender.A3.password=000000

 

#定義A3的布局和執行的SQL語句

log4j.appender.A3.Append = true

log4j.appender.A3.Threshold = WARN

log4j.appender.A3.layout=org.apache.log4j.PatternLayout

log4j.appender.A3.layout.ConversionPattern=INSERT INTO

TPDFLOG(CREATEDATE,THREAD,GRADE,CLASS,MESSAGE,PID,CURRENTSTATE) values('%d','%t','%-5p','%c','%m','%X{pid}',%X{currentstate})

輸出日志到數據庫

注意,開頭log4j.rootLogger = info,stdout,D,E,A3定義了輸出info級別到stdout控制台,D,E日志文本,A3數據庫,但是在定義輸出到A3數據庫時,又定義了:log4j.appender.A3.Threshold = WARN表示最低輸出級別;

也就是說:開頭一句定義了info級別以上的輸出到A3,后來又特定對A3定義了最低輸出級別為WARN,實際上只有WARN以上級別的日志才會輸出給A3;可以理解為,rootlogger是一般性定義,而threshold是特定性定義,實際級別是輸出2者重疊的部分!

在異常表里面自定義字段

如果想異常表與業務表關聯起來,必須在異常表類添加與業務表關聯的自定義字段;

INSERT INTO

TPDFLOG(CREATEDATE,THREAD,GRADE,CLASS,MESSAGE,PID,CURRENTSTATE) values('%d','%t','%-5p','%c','%m','%X{pid}',%X{currentstate})

注意,pid,和currentstate是要在日志在輸入給數據庫之前,必須先設置好,在logger.ERROR(“…”)之前:

        MDC.put("pid", pid);

        MDC.put("currentstate", 1);//1准備  2生成PDF 3上傳 4歸檔

這里用到了MDC,一開始在MDC里面存入這2個自定義字段的值,之后當捕獲到異常時,log4j根據級別准備執行上述sql語句以存儲信息到數據庫中對應的數據表,PID,CURRENTSTATE就是自定義的字段,sql語句中從MDC取值為'%X{pid}',%X{currentstate},前者string,后者Integer;

Ps:MESSAGE是當你在java中執行logger.ERROR(“相關信息”)時,ERROR括號中的部分,也就是’%m’, 其他的

'%d','%t','%-5p','%c'同理,log4j會自動取值;

    因為sql語句中要從MDC中的自定義字段取值,所以當你logger.error准備存儲日志給數據庫之前,必須保證MDC

有對應的自定義字段的key-value,如果沒有設置,那么在log4j存儲到數據庫時,會執行sql異常導致存儲到數據庫失敗;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM