歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

為什麼log4j的概念模型是錯的--zlog的模型簡介

假設你的log4j系統中有這樣的配置

log4j.logger.aa=ERROR, A1
log4j.logger.aa.bb=
log4j.logger.aa.cc=INFO

aa是一個父logger。aa.bb和aa.cc是aa的子logger。

aa.bb繼承了aa's等級和輸出(appender),等級是ERROR,輸出是A1。

aa.cc繼承並覆蓋了aa的級別。所以aa.cc的等級是INFO輸出還是A1。

需求1:如果我現在想把所有的aa的日志,所有的級別,輸出到一個特別的文件裡面去,並保持原來的aa.bb、aa.cc的輸出不變,如何實現?

需求2:假設我動了aa.bb的代碼,想在生產上把aa.bb的所有日志,從DEBUG級別開始輸出到某個aa.bb.debug.log,而保持aa的ERROR以上級別的日志不動(方便運維人員不改變他們的習慣,直接看原來的日志)

log4j將會如何實現這些需求?很困難,也許要在appender上引入阈值(threshold),或者引入子logger不繼承父logger的選項。子logger可以自己指定一個等級,或者從父logger那裡繼承一個。但說到底,log4j的logger必須有且只能有一個等級,等級和logger是綁定的。

zlog將會如何實現這些需求?首先,zlog繼承了syslog配置文件的思想,一個分類的不同等級可以同時存在不同的規則內。這就讓過濾同一分類的不同等級的日志到不同日志文件成為可能。

aa.debug        “/var/log/aa.debug.log”
aa.=notice      “/var/log/aa.notice.log”

是不是覺得自由了很多?

其次,在zlog裡面,所有的規則之間都是獨立的,沒有父子關系。綱目分類的關系表現在分類字符串中間的下劃線。舉例:

#rule 1
aa_bb.DEBUG        “/var/log/aa_bb.log”

#rule 2
aa_cc.INFO          “/var/log/aa_cc.log”

#rule 3
aa_.ERROR          “/var/log/aa_error.log”

#rule 4
aa.*                “/var/log/aa.log”

Copyright © Linux教程網 All Rights Reserved