为什么log4j的概念模型是错的--zlog的模型简介
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
? ? 假設(shè)你的log4j系統(tǒng)中有這樣的配置
log4j.logger.aa=ERROR, A1 log4j.logger.aa.bb= log4j.logger.aa.cc=INFO
? ? aa是一個(gè)父logger。aa.bb和aa.cc是aa的子logger。
? ? aa.bb繼承了aa's等級(jí)和輸出(appender),等級(jí)是ERROR,輸出是A1。
? ? aa.cc繼承并覆蓋了aa的級(jí)別。所以aa.cc的等級(jí)是INFO輸出還是A1。
? ? 需求1:如果我現(xiàn)在想把所有的aa的日志,所有的級(jí)別,輸出到一個(gè)特別的文件里面去,并保持原來的aa.bb、aa.cc的輸出不變,如何實(shí)現(xiàn)?
? ? 需求2:假設(shè)我動(dòng)了aa.bb的代碼,想在生產(chǎn)上把a(bǔ)a.bb的所有日志,從DEBUG級(jí)別開始輸出到某個(gè)aa.bb.debug.log,而保持aa的ERROR以上級(jí)別的日志不動(dòng)(方便運(yùn)維人員不改變他們的習(xí)慣,直接看原來的日志)
? ?log4j將會(huì)如何實(shí)現(xiàn)這些需求?很困難,也許要在appender上引入閾值(threshold),或者引入子logger不繼承父logger的選項(xiàng)。子logger可以自己指定一個(gè)等級(jí),或者從父logger那里繼承一個(gè)。但說到底,log4j的logger必須有且只能有一個(gè)等級(jí),等級(jí)和logger是綁定的。
? ?zlog將會(huì)如何實(shí)現(xiàn)這些需求?首先,zlog繼承了syslog配置文件的思想,一個(gè)分類的不同等級(jí)可以同時(shí)存在不同的規(guī)則內(nèi)。這就讓過濾同一分類的不同等級(jí)的日志到不同日志文件成為可能。
aa.debug “/var/log/aa.debug.log” aa.=notice “/var/log/aa.notice.log”
是不是覺得自由了很多?
? ? 其次,在zlog里面,所有的規(guī)則之間都是獨(dú)立的,沒有父子關(guān)系。綱目分類的關(guān)系表現(xiàn)在分類字符串中間的下劃線。舉例:
#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條獨(dú)立的規(guī)則。如果代碼里面的分類名是“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會(huì)被輸出到 aa_error.log。ERROR等級(jí)的日志會(huì)被同時(shí)寫在兩個(gè)文件里面。不過rule 4的變量字符串是”aa”,它不匹配分類變量”aa_bb”,它精確匹配擁有“aa”名字的分類變量。
? ? 這就是綱目分類模型。規(guī)則和規(guī)則之間是分開的。一個(gè)代碼分類變量可以匹配多個(gè)規(guī)則分類字符串,一個(gè)規(guī)則可以屬于多個(gè)代碼分類變量。規(guī)則中的綱分類字符串(以下劃線結(jié)尾的)匹配代碼中的目分類變量,綱分類字符串的范圍包括了了目分類字符串。這樣,用戶可以選擇任意范圍的綱目分類字符串來輸出,而不影響其他規(guī)則的行為。
? ? 事實(shí)上,在zlog_get_category()被調(diào)用的時(shí)候,并不保證代碼分類變量一定有相匹配的規(guī)則分類字符串。分類變量可以有很多與之匹配的規(guī)則,也有可能一條都沒有,這取決于配置文件是怎么寫的。當(dāng)配置文件改變并調(diào)用zlog_reload()后,代碼分類變量和規(guī)則分類字符串的匹配會(huì)被重新計(jì)算。根據(jù)上面所說的匹配方式,每個(gè)分類變量都會(huì)從新的配置文件里面找到自己的新規(guī)則。
? ? 也就是說,在zlog里面,多輸出是由多條規(guī)則來實(shí)現(xiàn)的,而不是log4j的多個(gè)appender。一條規(guī)則代表程序員對(duì)于某種分類和等級(jí)的日志的輸出需求。沒有必要指定某個(gè)分類必須為什么等級(jí)。分類、等級(jí)、輸出這3者可以自由搭配,完全解耦,這樣就帶來了極大的靈活性。
? ?必須感謝unix系統(tǒng)syslog的設(shè)計(jì)者,從思想上來說,zlog只是在他們的基礎(chǔ)上增加了一點(diǎn)點(diǎn)的改動(dòng)來匹配綱目分類,但靈活性遠(yuǎn)超java系列的綁定思想。也許log4j的設(shè)計(jì)者被繼承這兩個(gè)字晃花了眼,以為繼承就是解決一切問題的靈丹妙藥……
轉(zhuǎn)載于:https://my.oschina.net/HardySimpson/blog/53183
總結(jié)
以上是生活随笔為你收集整理的为什么log4j的概念模型是错的--zlog的模型简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。