系統(tǒng)日志管理那點(diǎn)事

說起日志,大家都是耳熟能詳?shù)?,一大堆日志插件映入眼簾,日志收集的方式也歷歷在目,但是,今天我們的重點(diǎn)不僅僅是收集日志了,今天我們主要說說怎么管理日志

收集日志

日志管理的第一件事,就是日志的收集。日志收集是開發(fā)者必備的技巧,不管是哪個(gè)開發(fā)語(yǔ)言,哪個(gè)開發(fā)平臺(tái),日志收集的插件都是有很多選擇的。例如:

.net 平臺(tái)大家鐘愛的log4net,支持多種存儲(chǔ)方式(文件、數(shù)據(jù)庫(kù)),多種格式,多種日志拆分方式。

java 平臺(tái)主流的log4j、slf4j、logback,多種選擇。

日志收集的組件這里就不一一說明了,使用都是很簡(jiǎn)單的,這里重點(diǎn)說明一下,日志我們收集應(yīng)該注意的地方:

1. 日志等級(jí)一定要規(guī)范
等級(jí) 說明
debug 調(diào)試信息
info 用來收集關(guān)注的信息
warn 警告信息
error 錯(cuò)誤信息

好多開發(fā)工程師記錄日志總是喜歡用info級(jí)別來記錄日志,一般的組件默認(rèn)級(jí)別都是info,所有info默認(rèn)都是會(huì)被記錄的,而debug信息發(fā)布后,是不會(huì)被記錄的。這是一種偷懶的做法,但這也是很普遍的做法。正確的方式應(yīng)該根據(jù)日志本身的特性去設(shè)置日志的級(jí)別,其實(shí)規(guī)范的日志級(jí)別是非常重要的:

  • 正確的級(jí)別便于運(yùn)維。便于統(tǒng)一調(diào)整系統(tǒng)日志級(jí)別,如特殊情況可以只記錄error錯(cuò)誤
  • 沒有正確的級(jí)別,對(duì)后期日志分析和處理是留下很大的隱患。error是需要去關(guān)注,并且處理掉的問題。info是普通日志的記錄,大部分時(shí)候是無(wú)需關(guān)注的。
2. error日志內(nèi)容一定要詳實(shí) ,info日志要簡(jiǎn)潔易懂

運(yùn)營(yíng)過大型系統(tǒng)的人都知道,除了數(shù)據(jù)庫(kù)存儲(chǔ)外,日志、圖片、附件是存儲(chǔ)的三大債主,他們是會(huì)占用非常非常大的空間,所有記錄info的日志,要簡(jiǎn)潔易懂,避免空間浪費(fèi)。
而對(duì)于error級(jí)別的錯(cuò)誤,記錄一定要詳實(shí),因?yàn)閑rror的所有問題,是后期都要去解決的。

  • 請(qǐng)求的地址
  • 請(qǐng)求的參數(shù)
  • 請(qǐng)求的ip
  • 請(qǐng)求的用戶
  • error具體信息
  • 輸出的內(nèi)容
  • ......

為了能很好的反饋當(dāng)時(shí)error產(chǎn)生場(chǎng)景,以上的這些內(nèi)容都應(yīng)該被記錄,而且越詳細(xì)越好。

3. error日志一定是全局統(tǒng)一收集的

前文說過,error的日志,不僅是我們需要關(guān)注的,還是我需要解決掉的問題,所有error日志非常重要。錯(cuò)誤日志的收集,必須是全局統(tǒng)一收集的,AOP是你最好的伙伴,如果你發(fā)現(xiàn)你的errorr日志收集是在每個(gè)類中,到處是

try
{
......
}
catch()
{
    log.error("......")
}

這個(gè)一定要避免,不管你用那種語(yǔ)言,錯(cuò)誤的處理,都是可以通過全局進(jìn)行統(tǒng)一的處理,錯(cuò)誤日志也要通過全局統(tǒng)一收集。

管理日志

每個(gè)開發(fā)人員對(duì)日志的收集,都是非常熟悉的,基本都是將日志按照日期的方式進(jìn)行保存,日常使用日志的時(shí)候,也是有一些要求:

1. 單個(gè)文件的大小要控制

因?yàn)榇蠹叶际峭ㄟ^日期方式保存的,但是因?yàn)橛械娜瞬恢匾暼罩?,?jīng)常會(huì)看到有的系統(tǒng)單個(gè)日志文件上百M(fèi),有的甚至是幾G,而實(shí)際大家處理問題關(guān)注的都是最近的日志,所以控制單個(gè)日志文件的大小,對(duì)日志的性能以及后期的運(yùn)維都是非常便利的。

2. 日志要便于瀏覽

日志文件小才便于瀏覽,日志最好能通過網(wǎng)址直接訪問到,而不需要一波三折登錄服務(wù)器,花10分鐘下載下來,再來分析。

3. 日志的安全性要得到保障

日志內(nèi)容有時(shí)會(huì)包含敏感信息,特別是error日志,直接把系統(tǒng)的具體錯(cuò)誤拋出來,所以日志除了查看方便,還需要確保日志文件的安全。如果是日志文件是html或者txt,請(qǐng)一定記得把你的日志文件權(quán)限修改下,特定用戶才能訪問,不要隨便開放,所有人都能訪問。

4. 日志要定期清理

日志是非常占用存儲(chǔ)的空間,日志太大對(duì)存儲(chǔ)的性能也有一定的影響,所有日志要定期進(jìn)行清理。

  • 空間充足可以保留半年
  • 空間不足最少也要保留3個(gè)月

當(dāng)然,這個(gè)也不是一定的,根據(jù)每個(gè)系統(tǒng)的情況去制定清理計(jì)劃就可以了。

如果大家是小型網(wǎng)站,一個(gè)系統(tǒng)一臺(tái)服務(wù)器,日志管理就簡(jiǎn)單了。如果系統(tǒng)是做了高可用,后端用了均衡負(fù)載,那么,日志存在當(dāng)前服務(wù)器是不太明智的做法,日志一定要統(tǒng)一存儲(chǔ),因?yàn)榫庳?fù)載隨時(shí)都可能會(huì)切換服務(wù)器,當(dāng)出現(xiàn)故障,你需要去找日志究竟存在哪個(gè)服務(wù)器,也是件很浪費(fèi)時(shí)間的事情。日志文件也可以通過:

  • 共享虛擬目錄來存儲(chǔ)
  • 定時(shí)進(jìn)行文件同步來存儲(chǔ)
    日志存儲(chǔ)也是對(duì)性能有一定影響的,文件同步雖然看起來麻煩一定,但是比共享虛擬目錄的方式來說,性能會(huì)好,推薦使用這種方式。

說到日志的同步,就不得不提Logstash這個(gè)日志組件。Logstash是現(xiàn)在應(yīng)用最廣的日志收集組件,基于java平臺(tái)。其實(shí)很多java平臺(tái)的組件,是不用去了解java開發(fā)的,只要簡(jiǎn)單的配置就能使用。

Logstash支持文件同步,也可以結(jié)合rsyslog進(jìn)行文件同步,當(dāng)然,也支持通過tcp協(xié)議,與第三方對(duì)接,好伙伴當(dāng)然是Elasticsearch。Elasticsearch下文也會(huì)做簡(jiǎn)單的介紹。

Logstash中文手冊(cè):點(diǎn)擊這里

分析日志

日志的分析也是一個(gè)很大的概念,可能對(duì)于運(yùn)維和安全人員關(guān)注的是系統(tǒng)的所有日志,包括訪問日志、系統(tǒng)監(jiān)測(cè)的日志等,但是開發(fā)人員對(duì)于日志更多的是:

  • 監(jiān)控系統(tǒng)運(yùn)行錯(cuò)誤,并獲取錯(cuò)誤時(shí)的相關(guān)數(shù)據(jù)包
  • 記錄重要的信息,某些時(shí)候便于后期檢查

所以,開發(fā)人員對(duì)日志的需求相對(duì)而言簡(jiǎn)單一點(diǎn),但是處理不當(dāng)也會(huì)面臨挑戰(zhàn)。如果要根據(jù)某些關(guān)鍵字找日志,沒有一個(gè)靠譜的系統(tǒng)處理,那么大家只能一直在ctrl+f 或者 find 命令中來回查找自己需要的信息,使用過的人都知道,這絕對(duì)不是一個(gè)很好的體驗(yàn)。那么是否有很好的工具來處理呢?有,這里就介紹另外的兩個(gè)工具:

  • Elasticsearch——一個(gè)基于lucene的搜索引擎工具,解決日志的搜索問題。當(dāng)然,也能解決系統(tǒng)的搜索問題,而且是分布式的哦。
  • Kibana——一個(gè)可視化的日志操作引擎,結(jié)合Elasticsearch可以達(dá)到更好的效果。

Kibana 界面預(yù)覽

Kibana 界面預(yù)覽

Elasticsearch+Logstash+Kibana 就是傳說中的ELK了,應(yīng)該是現(xiàn)在最流行的日志處理平臺(tái)。

Elasticsearch中文文檔:點(diǎn)擊這里
ELK中文文檔:點(diǎn)擊這里

尾聲

前文介紹日志收集、日志管理注意的事項(xiàng),推薦了日志分析中兩個(gè)比較簡(jiǎn)單常用的工具,這里簡(jiǎn)單說明一下,自己心目中的日志管理系統(tǒng)。
整體流程如圖:

推薦的幾個(gè)工具雖然是java平臺(tái)的工具,但是日志處理的思路不管是哪個(gè)平臺(tái)都是一樣的。ELK如果只是作為日志管理的工具,也可以應(yīng)用到.net平臺(tái),無(wú)需再進(jìn)行二次開發(fā)就可以很好的使用。ELK的使用是有一定的學(xué)習(xí)成本的,如有時(shí)間可以另起一文探討,但是,這個(gè)學(xué)習(xí)成本是可以忽略語(yǔ)言之間的差異。
當(dāng)然,如果大家愿意使用腳本同步或者rsyn文件同步進(jìn)行日志處理也是可以的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容