21 世紀(jì)的日志應(yīng)該給與更多關(guān)注
相比較人們目前對于日志的關(guān)心,我想人們應(yīng)該給予更多的關(guān)注。在設(shè)計(jì)一個(gè)應(yīng)用的時(shí)候,有許多的精力都耗費(fèi)在了創(chuàng)建客戶邏輯模型,確保所有用例被覆蓋并被正確處理。商務(wù)模型被映射到一個(gè)持久化存儲(是存在RDBMS或者是NoSQL解決方案中),人們挑選各種框架:web,中間件,批任務(wù),還有可能是用log4j或logback實(shí)現(xiàn)的SLF4J(簡單日志門面Simple Logging Facade for Java)。
幾乎所有我參與的應(yīng)用都是這樣的,日志往往都是二等公民,它依賴于良好的老的字符串日志框架。
但最近我意識到,需要日志記錄的東西遠(yuǎn)不止目前基于字符串的日志系統(tǒng)所做的。特別是在系統(tǒng)被部署在云端,具有良好的伸縮性時(shí),這時(shí)采集文本文件并將它們聚集到一個(gè)公共的地方,感覺就像是黑客行為。
在最近一個(gè)應(yīng)用中,我們實(shí)現(xiàn)了一種消息機(jī)制,它具有更復(fù)雜的信息,彌補(bǔ)了基于字符串日志的不足。我必須要感謝與我共事的一位同事,他說“消息位于我們應(yīng)用的核心”。我還未曾想過日志作為任何系統(tǒng)的核心。商務(wù)邏輯是應(yīng)用的核心,而不會是日志。但他的話富含真理,因?yàn)槿绻痪邆湟粋€(gè)能夠知道系統(tǒng)是否確如期望而動作的好的機(jī)制,你將無法部署任何東西。
所以我的通知是比較復(fù)雜的對象(調(diào)試級通知比錯(cuò)誤級通知的數(shù)據(jù)要少),NoSQL文檔數(shù)據(jù)庫是存放我們的日志的絕好存儲庫。一個(gè)通知內(nèi)包含了以下所有類型的數(shù)據(jù):
- 當(dāng)前正在制定的任務(wù),
- 數(shù)據(jù)來源,
- 發(fā)起日志的組件,
- 被拋出的異常,
- 輸入的參數(shù),
- 承載著我們的請求的Spring Integration Message的消息歷史。
然后,既然我可以用一種“無模式”的風(fēng)格來存儲復(fù)雜對象,我也就可以對日志進(jìn)行查詢,而且日志到達(dá)的順序也沒有什么影響,因?yàn)槲铱梢园凑諄碓春蛣?chuàng)建時(shí)間對他們進(jìn)行排序。這樣我就可以擁有一個(gè)安排好的任務(wù),用來在監(jiān)測到大量錯(cuò)誤的時(shí)候產(chǎn)生警告和報(bào)告。
這是一個(gè)定制的日志實(shí)現(xiàn),因?yàn)槲覀冞€沒有對提醒使用專用的框架,但我從中得到了比經(jīng)典的基于字符串的日志文件更多的價(jià)值。
我仍然認(rèn)為log4j和logback是很棒的實(shí)現(xiàn),我們還沒有替換它們,僅僅加入了一個(gè)額外的日志特征來克服它們的局限,但即使有了新的logback輸出源,我依然認(rèn)為當(dāng)前基于字符串的日志對于生產(chǎn)系統(tǒng)需求來說太簡單了。如果你使用它們更多是為了調(diào)試的目的,而且在生產(chǎn)環(huán)境有額外的監(jiān)控方法,那么也許是時(shí)候使用一個(gè)聰明的、可以在開發(fā)和生產(chǎn)環(huán)境應(yīng)用的日志解決方案。
假如說10年前,當(dāng)關(guān)系型數(shù)據(jù)庫統(tǒng)治著存儲世界,這是一件很難實(shí)現(xiàn)的事情,而基于文件日志是一個(gè)很好的折中方案。那么我認(rèn)為現(xiàn)在我們已經(jīng)有方法實(shí)現(xiàn)一個(gè)更好的日志框架。當(dāng)前“基于String的文件日志”模型已經(jīng)很有效率了,尤其是當(dāng)我們的服務(wù)器垂直縮放在單個(gè)機(jī)器中。但是在一個(gè)有許多水平分布服務(wù)器的世界,這種模型需要額外的處理。
大玩家們已經(jīng)使用這種新一代日志系統(tǒng)了,譬如Facebook Scribe和 LinkedIn Kafka log processing.
我真的喜歡 LinkedIn 的方案,而且他也是鼓舞著我去探尋出一個(gè)工作在CQRS時(shí)尚的新的日志系統(tǒng)。在這個(gè)日志系統(tǒng)中,日志實(shí)體像事件一樣存入日志數(shù)據(jù)庫,而且每一個(gè)事件通過一系列操作來更新當(dāng)前的系統(tǒng)狀態(tài)。這個(gè)就結(jié)合了日志和監(jiān)視器,而且每個(gè)監(jiān)視命令直接緩存***的系統(tǒng)狀態(tài)呈現(xiàn),這些狀態(tài)包括:
- 警報(bào)
- 狀態(tài)報(bào)告
- 監(jiān)控當(dāng)前系統(tǒng)狀態(tài)的視圖
它聽起來怎么樣,是不是值得實(shí)現(xiàn)這個(gè)方案,我們是不是應(yīng)該開啟一個(gè)新一代日志的開源項(xiàng)目了?