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異常導致存儲到數據庫失敗;
