为什么log4j的概念模型是错的--zlog的模型简介
2019獨角獸企業重金招聘Python工程師標準>>>
? ? 假設你的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”
沒有繼承,只有4條獨立的規則。如果代碼里面的分類名是“aa_bb”。代碼就像這樣:
category_t ab;ab = zlog_get_category(“aa_bb”);ZLOG_DEBUG(ab, “ab's debug”); ZLOG_ERROR(ab, “ab's error”);
? ? 配置中,rule 1的分類字符串”aa_bb”和rule 3的分類字符串”aa_”,與代碼中的名字為”aa_bb”的分類變量是匹配的。于是代碼中屬于aa_bb分類變量、>=DEBUG日志輸出到aa_bb.log,屬于aa_bb分類變量、>=ERROR會被輸出到 aa_error.log。ERROR等級的日志會被同時寫在兩個文件里面。不過rule 4的變量字符串是”aa”,它不匹配分類變量”aa_bb”,它精確匹配擁有“aa”名字的分類變量。
? ? 這就是綱目分類模型。規則和規則之間是分開的。一個代碼分類變量可以匹配多個規則分類字符串,一個規則可以屬于多個代碼分類變量。規則中的綱分類字符串(以下劃線結尾的)匹配代碼中的目分類變量,綱分類字符串的范圍包括了了目分類字符串。這樣,用戶可以選擇任意范圍的綱目分類字符串來輸出,而不影響其他規則的行為。
? ? 事實上,在zlog_get_category()被調用的時候,并不保證代碼分類變量一定有相匹配的規則分類字符串。分類變量可以有很多與之匹配的規則,也有可能一條都沒有,這取決于配置文件是怎么寫的。當配置文件改變并調用zlog_reload()后,代碼分類變量和規則分類字符串的匹配會被重新計算。根據上面所說的匹配方式,每個分類變量都會從新的配置文件里面找到自己的新規則。
? ? 也就是說,在zlog里面,多輸出是由多條規則來實現的,而不是log4j的多個appender。一條規則代表程序員對于某種分類和等級的日志的輸出需求。沒有必要指定某個分類必須為什么等級。分類、等級、輸出這3者可以自由搭配,完全解耦,這樣就帶來了極大的靈活性。
? ?必須感謝unix系統syslog的設計者,從思想上來說,zlog只是在他們的基礎上增加了一點點的改動來匹配綱目分類,但靈活性遠超java系列的綁定思想。也許log4j的設計者被繼承這兩個字晃花了眼,以為繼承就是解決一切問題的靈丹妙藥……
轉載于:https://my.oschina.net/HardySimpson/blog/53183
總結
以上是生活随笔為你收集整理的为什么log4j的概念模型是错的--zlog的模型简介的全部內容,希望文章能夠幫你解決所遇到的問題。