日志系统设计
日志系統(tǒng)設(shè)計(jì)??
2009-12-11 00:46:58|??分類: 技術(shù) |??標(biāo)簽: |字號(hào)大中小?訂閱
一、重要性日志系統(tǒng)在整個(gè)系統(tǒng)架構(gòu)中的重要性可以稱得上基礎(chǔ)的基礎(chǔ),但是這一點(diǎn),都容易被大多數(shù)人所忽視。因?yàn)槿罩驹诤芏嗳丝磥?lái)只是printf。在系統(tǒng)運(yùn)行期間,是很難step by step的,所以只能根據(jù)系統(tǒng)的運(yùn)行軌跡來(lái)推斷錯(cuò)誤出現(xiàn)的位置,這往往也是唯一的資料,特別是在高可靠性的情況下。
從更大方面的范圍來(lái)說,日志系統(tǒng)是運(yùn)營(yíng)維護(hù)的范疇。但小的方面來(lái)說,這是必須的調(diào)試的手段。在多年的開發(fā)經(jīng)驗(yàn)來(lái)看,日志系統(tǒng)必須被我們重視的。
二、解決問題
日志系統(tǒng)的主要解決的問題是記錄系統(tǒng)的運(yùn)行軌跡,在這個(gè)基礎(chǔ)上,進(jìn)行跟蹤分析錯(cuò)誤,審計(jì)系統(tǒng)運(yùn)行流程。在高可靠的系統(tǒng)中,是不允許系統(tǒng)運(yùn)行終止的。日志系統(tǒng)的內(nèi)容可以分為2類,一類可是業(yè)務(wù)級(jí)別的日志,主要供終端用戶來(lái)分析他們業(yè)務(wù)過程;另一類是系統(tǒng)級(jí)別的日志,供開發(fā)者維護(hù)系統(tǒng)的穩(wěn)定。
由于日志系統(tǒng)的數(shù)據(jù)輸出量比較大,所以不能不考慮對(duì)整個(gè)系統(tǒng)性能的影響。從另外一方面來(lái)看,海量的日志內(nèi)容有時(shí)候并不件好事,因?yàn)?#xff0c;很容易覆蓋真實(shí)問題的蛛絲馬跡。也增加日志閱讀者信息檢索的困難。
日志系統(tǒng)的設(shè)計(jì),必須解決幾個(gè)問題:
1、使用方便,包括開發(fā)和信息檢索。
2、組織合理,日志內(nèi)容被有效的組織起來(lái)。有助于基于日志內(nèi)容的分析。
3、過程重現(xiàn),這個(gè)目標(biāo)其實(shí)對(duì)開發(fā)者來(lái)說是最重要的。基于日志的分析,最重要的是重現(xiàn)當(dāng)時(shí)運(yùn)行的過程。
4、可控制性,允許用戶進(jìn)行干預(yù),特別是運(yùn)行期的干預(yù)。比如關(guān)閉某些內(nèi)容,或者重定向內(nèi)容的輸入目標(biāo)點(diǎn)。
三、系統(tǒng)構(gòu)成
一個(gè)日志系統(tǒng)根據(jù)他的過程,可以分為日志來(lái)源,系統(tǒng)控制,日志輸出,【日志存儲(chǔ)】。根據(jù)這個(gè)過程,我們可以將整個(gè)系統(tǒng)分為4個(gè)模塊,并加以抽象。
1、日志來(lái)源
日志內(nèi)容可以來(lái)源于任何其他系統(tǒng),但對(duì)日志系統(tǒng)來(lái)說,這是個(gè)格式化的緩沖區(qū)。對(duì)于日志系統(tǒng)來(lái)說,任何內(nèi)容都是合法的。最重要的是,日志系統(tǒng)必須提供一個(gè)簡(jiǎn)單的規(guī)則,為后續(xù)的管理和檢索提供方便性和靈活性。在傳統(tǒng)的printf格式中,是很難維護(hù)一個(gè)格式化的日志輸出。文本方式對(duì)人來(lái)說閱讀方便,但不容易檢索,特別是在大量日志的情況下,更不好維護(hù)了。
2、日志控制
系統(tǒng)控制的重點(diǎn)在于控制日志內(nèi)容在日志系統(tǒng)中的流轉(zhuǎn)過程。比如日志輸出目的地,比如日志的輸出級(jí)別。我們?cè)赼pache的Logging項(xiàng)目中曾經(jīng)看到,他們提供了一個(gè)和平時(shí)不太一樣的輸出目的地,telnet。這和傳統(tǒng)的stdout、stderr、syslog有很大的區(qū)別,便于遠(yuǎn)程管理,更大的潛力在于,可以在運(yùn)行期,通過登錄telnet來(lái)動(dòng)態(tài)調(diào)整系統(tǒng)環(huán)境配置。
3、日志輸出
日志在控制臺(tái)輸出是比較常見的,但如何考慮為系統(tǒng)的可靠性提供支持,以及大量日志內(nèi)容的情況下,這個(gè)一般不予考慮的。在控制臺(tái)輸出的,只會(huì)是非常核心的內(nèi)容或者是致命的錯(cuò)誤,況且,在有些情況下,不一樣會(huì)有控制臺(tái)。我們一般在這種情況下,都傾向于將日志輸出到文件。但對(duì)一個(gè)完善的日志系統(tǒng),日志輸出和日志存儲(chǔ)又是有區(qū)別的。日志存儲(chǔ)是日志輸出到文件的一種方式。日志輸出也是日志控制的一個(gè)內(nèi)容。
4、日志存儲(chǔ)
日志存儲(chǔ)在很多小型系統(tǒng)往往并不需要關(guān)注,一個(gè)可靠性要求很高的系統(tǒng)中,對(duì)日志存儲(chǔ)卻是極為苛刻。就是在現(xiàn)在的數(shù)據(jù)庫(kù)系統(tǒng)中,也必須依賴日志的存在,來(lái)還原操作。
四、日志內(nèi)容
1、內(nèi)容分級(jí)
在LINUX的SYSLOG中,對(duì)日志內(nèi)容進(jìn)行分級(jí),將分為8個(gè)級(jí)別,如下:
#define LOG_EMERG 0 /* system is unusable */
#define LOG_ALERT 1 /* action must be taken immediately */
#define LOG_CRIT 2 /* critical conditions */
#define LOG_ERR 3 /* error conditions */
#define LOG_WARNING 4 /* warning conditions */
#define LOG_NOTICE 5 /* normal but significant condition */
#define LOG_INFO 6 /* informational */
#define LOG_DEBUG 7 /* debug-level messages */
這樣,我們只需要設(shè)置一個(gè)全局變量,監(jiān)控日志內(nèi)容輸出級(jí)別。當(dāng)產(chǎn)生日志內(nèi)容的級(jí)別比輸出級(jí)別更優(yōu)先時(shí),將被記錄下來(lái),否則被簡(jiǎn)單的忽略。這種方式,很容易控制日志的輸出內(nèi)容。在WIN32平臺(tái)下,有分類的功能,但是沒有分級(jí)。但實(shí)際上也有個(gè)問題,就是只能控制一個(gè)輸出范圍,如果想只輸出特定類的日志內(nèi)容,在策略上,還是比較麻煩的。
2、內(nèi)容分類
在LINUX的SYSLOG中,不但對(duì)日志內(nèi)容有分級(jí),同樣也有分類,主要是根據(jù)日志內(nèi)容的來(lái)源,如下:
#define LOG_KERN (0<<3) /* kernel messages */
#define LOG_USER (1<<3) /* random user-level messages */
#define LOG_MAIL (2<<3) /* mail system */
#define LOG_DAEMON (3<<3) /* system daemons */
#define LOG_AUTH (4<<3) /* security/authorization messages */
#define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */
#define LOG_LPR (6<<3) /* line printer subsystem */
#define LOG_NEWS (7<<3) /* network news subsystem */
#define LOG_UUCP (8<<3) /* UUCP subsystem */
#define LOG_CRON (9<<3) /* clock daemon */
#define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */
#define LOG_FTP (11<<3) /* ftp daemon */
在WIN32平臺(tái)下的事件管理器也是有相應(yīng)的功能,只是有部分區(qū)別。WIN32的系統(tǒng)日志被分為安全性、應(yīng)用程序、系統(tǒng)等幾類。每類都有幾個(gè)固定的字段,日志內(nèi)容是以文本方式被保存的。分類的主要依據(jù)也是日志內(nèi)容的來(lái)源。
3、內(nèi)容格式
雖然內(nèi)容的分級(jí)和分類在很大的程度上,對(duì)日志內(nèi)容進(jìn)行歸類,但這遠(yuǎn)遠(yuǎn)不夠。這個(gè)規(guī)則的粒度相當(dāng)粗糙。也就是說,針對(duì)特定級(jí)別特定類的日志內(nèi)容也會(huì)是相當(dāng)?shù)佚嫶蟆R虼擞斜匾槍?duì)日志內(nèi)容在更小粒度的劃分,就是內(nèi)容格式的設(shè)計(jì)。內(nèi)容格式的設(shè)計(jì)上,有個(gè)很致命的問題,就是內(nèi)容的多樣性,很難用一個(gè)統(tǒng)一的格式來(lái)限定內(nèi)容輸出。對(duì)于動(dòng)態(tài)內(nèi)容的格式話,其實(shí)我們也有幾個(gè)現(xiàn)成方案值得借鑒。
首先、XML在格式化多樣性內(nèi)容方面具有相當(dāng)大的靈活性,不過他也有個(gè)致命的弱點(diǎn),就是解析內(nèi)容時(shí),具有相當(dāng)大的時(shí)間復(fù)雜度。
其實(shí)、TDS協(xié)議是SYBASE數(shù)據(jù)庫(kù)在輸出DBMS結(jié)果給客戶端時(shí),數(shù)據(jù)流的格式。他允許在一個(gè)流中存在不同類表的數(shù)據(jù),比如多個(gè)不同結(jié)果字段的游標(biāo)。在靈活性方面不如XML,但速度要快于XML。
最后、每個(gè)內(nèi)容塊都遵循同樣的格式,這種方式,靈活性最差,但要簡(jiǎn)單多了。整個(gè)日志內(nèi)容相當(dāng)于一個(gè)固定結(jié)構(gòu)的表。
從筆者的角度出發(fā),傾向于以TDS的格式為基礎(chǔ),引進(jìn)XML的某些特性,來(lái)設(shè)計(jì)出一個(gè)內(nèi)容格式。
4、內(nèi)容邊界
日志系統(tǒng)可能需要將各種各種格式的日志內(nèi)容統(tǒng)一存儲(chǔ)在一起,這些內(nèi)容同樣可能是不同的大小,因此我們需要確認(rèn)每個(gè)內(nèi)容邊界,否則極有可能混淆每個(gè)內(nèi)容的確切內(nèi)容。內(nèi)容邊界是日志系統(tǒng)設(shè)計(jì)的一個(gè)最基本細(xì)節(jié),否則這個(gè)日志系統(tǒng)將是不可能。沒法確切區(qū)分每個(gè)日志內(nèi)容,后續(xù)的分析就沒法是實(shí)現(xiàn)了。內(nèi)容邊界的設(shè)計(jì),在日志存儲(chǔ)系統(tǒng)之前就必須是明確的。
五、日志控制
1、控制目標(biāo)
日志系統(tǒng)要控制的目標(biāo)包含整個(gè)日志內(nèi)容流轉(zhuǎn)的過程。對(duì)日志來(lái)源的控制,一般著重于對(duì)日志內(nèi)容的過濾。上面對(duì)內(nèi)容進(jìn)行分級(jí)、分類、制定格式,一個(gè)最重要的原因就是對(duì)日志內(nèi)容的過濾。對(duì)日志輸出控制,主要著重于輸出目的,比如是文件還是SYSLOG,以及諸如此類。
日志控制是日志內(nèi)容流轉(zhuǎn)過程中的一個(gè)強(qiáng)化功能。一般來(lái)說,越多的日志內(nèi)容,對(duì)系統(tǒng)跟蹤分析更有利,但更多的內(nèi)容,就越增加分析的難度。所以我們需要通過日志控制這個(gè)功能來(lái)進(jìn)行平衡。
2、來(lái)源控制
一個(gè)最明顯的例子,為了方便調(diào)試,可能需要在系統(tǒng)中增加調(diào)試信息,在正在發(fā)布中,這些是不需要。所以在很多系統(tǒng)發(fā)布版本中,都要區(qū)分發(fā)布版和調(diào)試版。如果增加了來(lái)源控制系統(tǒng),那么這些事情就簡(jiǎn)單多了。我們只要將這些信息簡(jiǎn)單地分級(jí)分類。通過一個(gè)邏輯控制,將不需要的給過濾掉。前面的分級(jí)分類的工作,在這個(gè)時(shí)候就會(huì)發(fā)揮很大的作用。
在wireshark,原來(lái)的ethereal,允許自己編輯過濾條件。POSIX的正則表達(dá)式也是個(gè)很好的設(shè)置過濾條件工具。過濾是來(lái)源控制功能的一個(gè)很重要的工作。實(shí)際上,內(nèi)容在來(lái)源上已經(jīng)產(chǎn)生,只是沒有到達(dá)或者說沒有必要到達(dá)到輸出目的地。
3、輸出控制
輸出控制是日志控制的一個(gè)重要工作,但是這個(gè)工作和日志輸出會(huì)有個(gè)概念重合的地方。控制只是負(fù)責(zé)按規(guī)則解釋這個(gè)內(nèi)容究竟是否需要輸出,至于輸出的具體內(nèi)容,其實(shí)和他已經(jīng)沒有什么關(guān)系了。
六、日志輸出
日志輸出有兩個(gè)重點(diǎn)功能,就是輸出什么樣以及往哪里輸出。
1、輸出格式
輸出格式,是解釋內(nèi)容是什么樣的工作,printf的格式串是很明顯的例子。但是一個(gè)強(qiáng)大的日志系統(tǒng)可能更為復(fù)雜,比如DBMS的日志系統(tǒng)。格式問題往往在日志檢索中,或者日志分析中,體現(xiàn)出巨大的作用。在通常的使用中,還是要依賴于分級(jí)和分類。不過格式的使用,針對(duì)日志內(nèi)容級(jí)別的檢索和分析將更為有用。
2、輸出目標(biāo)
輸出目標(biāo)通常為文件,控制臺(tái),syslog,在apache logging項(xiàng)目中還有個(gè)telnet。在文件和syslog作為輸出目標(biāo)時(shí),其實(shí)和存儲(chǔ)已經(jīng)很相似了。往哪個(gè)目標(biāo)輸出是輸出控制的功能,不過,每個(gè)目標(biāo)輸出內(nèi)容應(yīng)該如何輸出,就是日志輸出的工作了。
3、telnet
telnet作為輸出目標(biāo)是很少見,因?yàn)樗容^復(fù)雜,不過,因?yàn)樗δ軓?qiáng)大,所以,在大型服務(wù)器中,是非常需要的。在這里必須著重提醒一下。apache logging項(xiàng)目,專門有個(gè)功能。telnet配合日志控制,允許在運(yùn)行期得到更為詳細(xì)的功能供調(diào)試。這是個(gè)很重要的特性,他提供了在運(yùn)行期和系統(tǒng)進(jìn)行交互的一個(gè)手段。
七、日志存儲(chǔ)
日志存儲(chǔ)其實(shí)是日志輸出的一部分,不過是日志輸出中一個(gè)很特別的部分。日志輸出可能沒有IO操作,只在內(nèi)存中完成操作,但是日志存儲(chǔ)是必須存儲(chǔ)到物理磁盤中。這個(gè)特性就會(huì)涉及到一個(gè)效率問題。我們知道IO操作和內(nèi)存操作的性能級(jí)別不是一個(gè)數(shù)量級(jí)的。當(dāng)日志系統(tǒng)涉及到存儲(chǔ)時(shí),就必須考慮到性能問題。當(dāng)大量的數(shù)據(jù)頻繁地被寫入到磁盤中,性能問題就更為嚴(yán)重。必須采取更有效的措施來(lái)避免寫盤操作對(duì)其他系統(tǒng)的影響。
原文轉(zhuǎn)自:http://blog.csdn.net/romandion/archive/2007/11/10/1877189.aspx
總結(jié)
- 上一篇: JAVA中断线程的方法
- 下一篇: 轻松搭建一个Windows SVN服务器