把重要的業務日誌非同步批量寫入資料庫 LOG4J__資料庫
最後更新:2018-07-24
來源:互聯網
上載者:User
Log4j 中階應用
1. 把重要的業務日誌非同步批量寫入資料庫
設定檔樣本:
log4j.logger.business=INFO,db
log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.BufferSize=10
log4j.appender.db.URL=jdbc:hsqldb:res:/hsqldb/bookstore
log4j.appender.db.driver=org.hsqldb.jdbcDriver
log4j.appender.db.user=sa
log4j.appender.db.password=
log4j.appender.db.sql=INSERT INTO SS_LOG4J_LOG (PRIORITY,LOGDATE,CLASS,METHOD,MSG) VALUES('%p','%d{yyyy-MM-dd HH:mm:ss}','%C','%M','%m')
log4j.appender.db.layout=org.apache.log4j.PatternLayout log4j提供了簡單靈活且不影響效能的機制, 將重要業務日誌寫入資料庫,方便日後的查詢:
1. 建立一個任意命名的記錄資料表,在log4j.properties裡設定串連參數,根據剛才建的表名列名,編寫插入的語句。
2. BufferSize=10 這樣的參數可以讓日誌非同步批量寫入,不會影響系統效能。
3. 業務日誌log最好不要用原來的package結構,而是在項目裡協調一個獨立的名字,如business。
Log buzzLog = LogFactory.getLog("business"); 4. 以上功能的示範代碼在bookstore example 的OrderManager.java,測試代碼在bookstore example的DBLogTest.java。
2.Spring 對log4j的幾個增強
個人建議都不要使用。
1. 定時重新整理log4j properties檔案,無須重啟伺服器Apply 新的log4j設定。
雖然這是個J2EE Best Practice,但在Spring的JavaDoc裡註明了不推薦用於生產環境,因為伺服器重啟的時候,那條watch thread 不會關閉。
2.將log4j.properties 檔案放在WEB-INF/log4j.properties。
這種增強看不出有什麼好處,而且如果放WEB-INF,測試的時候就不能輸出log4j資訊了,除非像Appfuse那樣把WEB-INF也設為class path,不過這種設法只適用於Ant指令碼的情況。
3. 通過設定{web.root} 這樣的系統變數,將log檔案放到項目的WEB-INF目錄中
log4j.appender.logfile.File=${bookstore.root}/WEB-INF/logs /bookstore.log這樣做的好處是路徑比較穩定,但如果是war式的部署,每次重新部署的時候就會把原來的log檔案全部刪掉,遇上jboss 這種不解壓war包的應用伺服器就更會出錯,所以把log檔案放WEB-INF/logs不是一個好的選擇。
其實logfile路徑的規則是,如果不是絕對路徑,就以應用啟動並執行目錄作為相對路徑的根目錄。
所以我平時這樣定義,一般就指向tomcat 和很多應用伺服器的logs目錄:
log4j.appender.logfile.File=../logs/bookstore.log這樣的缺點是,假設你把Tomcat /bin目錄添加到了PATH變數的值中去,並喜歡從Windows開始菜單的運行框裡輸入"startup.bat"啟動Tomcat,這時Log4j 的日誌就會被放到C:\Documents And Settings\logs目錄中去。
3. 忽略某些類庫架構的不必要的資訊
控制第三方架構類庫的logging level,可以避免滿屏都是不重要的info,把真正重要的資訊掩蓋了。
# Changing the log level to DEBUG when debug
log4j.logger.org.springframework=WARN
# Changing the log level to DEBUG will display SQL Hibernate generated
log4j.logger.org.hibernate=WARN
log4j.logger.org.hibernate.SQL=ERROR