天天看點

系統日志管理那點事

說起日志,大家都是耳熟能詳的,一大堆日志插件映入眼簾,日志收集的方式也曆曆在目,但是,今天我們的重點不僅僅是收集日志了,今天我們主要說說怎麼管理日志

收集日志

日志管理的第一件事,就是日志的收集。日志收集是開發者必備的技巧,不管是哪個開發語言,哪個開發平台,日志收集的插件都是有很多選擇的。例如:

.net 平台大家鐘愛的log4net,支援多種存儲方式(檔案、資料庫),多種格式,多種日志拆分方式。

java 平台主流的log4j、slf4j、logback,多種選擇。

日志收集的元件這裡就不一一說明了,使用都是很簡單的,這裡重點說明一下,日志我們收集應該注意的地方:

1. 日志等級一定要規範
等級 說明
debug 調試資訊
info 用來收集關注的資訊
warn 警告資訊
error 錯誤資訊

好多開發工程師記錄日志總是喜歡用info級别來記錄日志,一般的元件預設級别都是info,所有info預設都是會被記錄的,而debug資訊釋出後,是不會被記錄的。這是一種偷懶的做法,但這也是很普遍的做法。正确的方式應該根據日志本身的特性去設定日志的級别,其實規範的日志級别是非常重要的:

  • 正确的級别便于運維。便于統一調整系統日志級别,如特殊情況可以隻記錄error錯誤
  • 沒有正确的級别,對後期日志分析和處理是留下很大的隐患。error是需要去關注,并且處理掉的問題。info是普通日志的記錄,大部分時候是無需關注的。
2. error日志内容一定要詳實 ,info日志要簡潔易懂

營運過大型系統的人都知道,除了資料庫存儲外,日志、圖檔、附件是存儲的三大債主,他們是會占用非常非常大的空間,所有記錄info的日志,要簡潔易懂,避免空間浪費。

而對于error級别的錯誤,記錄一定要詳實,因為error的所有問題,是後期都要去解決的。

  • 請求的位址
  • 請求的參數
  • 請求的ip
  • 請求的使用者
  • error具體資訊
  • 輸出的内容
  • ......

為了能很好的回報當時error産生場景,以上的這些内容都應該被記錄,而且越詳細越好。

3. error日志一定是全局統一收集的

前文說過,error的日志,不僅是我們需要關注的,還是我需要解決掉的問題,所有error日志非常重要。錯誤日志的收集,必須是全局統一收集的,AOP是你最好的夥伴,如果你發現你的errorr日志收集是在每個類中,到處是

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

這個一定要避免,不管你用那種語言,錯誤的處理,都是可以通過全局進行統一的處理,錯誤日志也要通過全局統一收集。

管理日志

每個開發人員對日志的收集,都是非常熟悉的,基本都是将日志按照日期的方式進行儲存,日常使用日志的時候,也是有一些要求:

1. 單個檔案的大小要控制

因為大家都是通過日期方式儲存的,但是因為有的人不重視日志,經常會看到有的系統單個日志檔案上百M,有的甚至是幾G,而實際大家處理問題關注的都是最近的日志,是以控制單個日志檔案的大小,對日志的性能以及後期的運維都是非常便利的。

2. 日志要便于浏覽

日志檔案小才便于浏覽,日志最好能通過網址直接通路到,而不需要一波三折登入伺服器,花10分鐘下載下傳下來,再來分析。

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

日志内容有時會包含敏感資訊,特别是error日志,直接把系統的具體錯誤抛出來,是以日志除了檢視友善,還需要確定日志檔案的安全。如果是日志檔案是html或者txt,請一定記得把你的日志檔案權限修改下,特定使用者才能通路,不要随便開放,所有人都能通路。

4. 日志要定期清理

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

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

當然,這個也不是一定的,根據每個系統的情況去制定清理計劃就可以了。

如果大家是小型網站,一個系統一台伺服器,日志管理就簡單了。如果系統是做了高可用,後端用了均衡負載,那麼,日志存在目前伺服器是不太明智的做法,日志一定要統一存儲,因為均衡負載随時都可能會切換伺服器,當出現故障,你需要去找日志究竟存在哪個伺服器,也是件很浪費時間的事情。日志檔案也可以通過:

  • 共享虛拟目錄來存儲
  • 定時進行檔案同步來存儲

    日志存儲也是對性能有一定影響的,檔案同步雖然看起來麻煩一定,但是比共享虛拟目錄的方式來說,性能會好,推薦使用這種方式。

說到日志的同步,就不得不提Logstash這個日志元件。Logstash是現在應用最廣的日志收集元件,基于java平台。其實很多java平台的元件,是不用去了解java開發的,隻要簡單的配置就能使用。

Logstash支援檔案同步,也可以結合rsyslog進行檔案同步,當然,也支援通過tcp協定,與第三方對接,好夥伴當然是Elasticsearch。Elasticsearch下文也會做簡單的介紹。

Logstash中文手冊:

點選這裡

分析日志

日志的分析也是一個很大的概念,可能對于運維和安全人員關注的是系統的所有日志,包括通路日志、系統監測的日志等,但是開發人員對于日志更多的是:

  • 監控系統運作錯誤,并擷取錯誤時的相關資料包
  • 記錄重要的資訊,某些時候便于後期檢查

是以,開發人員對日志的需求相對而言簡單一點,但是處理不當也會面臨挑戰。如果要根據某些關鍵字找日志,沒有一個靠譜的系統處理,那麼大家隻能一直在ctrl+f 或者 find 指令中來回查找自己需要的資訊,使用過的人都知道,這絕對不是一個很好的體驗。那麼是否有很好的工具來處理呢?有,這裡就介紹另外的兩個工具:

  • Elasticsearch——一個基于lucene的搜尋引擎工具,解決日志的搜尋問題。當然,也能解決系統的搜尋問題,而且是分布式的哦。
  • Kibana——一個可視化的日志操作引擎,結合Elasticsearch可以達到更好的效果。

Kibana 界面預覽

系統日志管理那點事

Elasticsearch+Logstash+Kibana 就是傳說中的ELK了,應該是現在最流行的日志處理平台。

Elasticsearch中文文檔:

ELK中文文檔:

尾聲

前文介紹日志收集、日志管理注意的事項,推薦了日志分析中兩個比較簡單常用的工具,這裡簡單說明一下,自己心目中的日志管理系統。

整體流程如圖:

系統日志管理那點事

推薦的幾個工具雖然是java平台的工具,但是日志處理的思路不管是哪個平台都是一樣的。ELK如果隻是作為日志管理的工具,也可以應用到.net平台,無需再進行二次開發就可以很好的使用。ELK的使用是有一定的學習成本的,如有時間可以另起一文探讨,但是,這個學習成本是可以忽略語言之間的差異。

當然,如果大家願意使用腳本同步或者rsyn檔案同步進行日志處理也是可以的。