前邊有兩篇ELK的文章分別介紹了MySQL慢日誌收集和Nginx訪問日誌收集,那麼各種不同型別應用程式的日誌該如何方便的進行收集呢?且看本文我們是如何高效處理這個問題的
日誌規範
規範的日誌存放路徑和輸出格式將為我們後續的收集和分析帶來極大的方便,無需考慮各種不同路徑、格式的相容問題,只需要針對固定幾類日誌做適配就可以了,具體的規範如下:
日誌存放路徑規範
- 專案日誌只能輸出到固定的位置,例如
/data/logs/
目錄下 - 同一型別(例如java web)的日誌檔名保持統一,例如都叫
application.log
- 一個型別的專案可以記錄多個不同的日誌檔案,例如
exception.log
和business.log
日誌輸出格式規範
- 日誌輸出必須為JSON格式,這個很重要
- 同一型別的專案應採用統一的日誌輸出標準,儘量將日誌輸出模組化,所有專案引用同一模組
- 輸出日誌中必須包含標準時間(timestamp)、應用名稱(appname)、級別(level)欄位,日誌內容記錄清晰易懂
日誌資訊級別規範
日誌級別 | 說明 | 數值 |
---|---|---|
debug | 除錯日誌,日誌資訊量最多 | 7 |
info | 一般資訊日誌,最常用的級別 | 6 |
notice | 最具有重要性的普通條件資訊 | 5 |
warning | 警告級別 | 4 |
error | 錯誤級別,某個功能不能正常工作 | 3 |
critical | 嚴重級別,整個系統不能正常工作 | 2 |
alert | 需要立刻修改的日誌 | 1 |
emerg | 核心崩潰等嚴重資訊 | 0 |
從上到下級別依次從低到高,日誌量從多到少,正確選擇日誌級別幫助後期快速排查問題
我們為什麼要制定這樣的規範?
- 我們的專案都跑在Docker裡,Docker映象由基礎映象+專案程式碼組成
- 基礎映象打包了執行專案的基礎環境,例如spring cloud微服務專案,則打包了jre服務
- 規範了日誌存放及輸出後,我們可以把作為日誌收集agent的filebeat一併打包進基礎映象,因為同一型別專案的日誌路徑、格式都是一致的,filebeat配置檔案可以通用
- 這樣我們在後續的部署過程中就不需要關心日誌相關的內容,只要專案映象引用了這個基礎映象就能自動接入了我們的日誌服務,實現日誌的收集、處理、儲存與展示
日誌採集
我們通用日誌採集方案如下圖:
- 程式跑在容器裡,容器內自帶Filebeat程式收集日誌
- 收集完成後傳給kafka叢集,logstash讀取kafka叢集資料寫入elasticsearch叢集
- kibana讀取elasticsearch叢集資料展示在web上,開發、運維等需要檢視日誌的使用者登入kibana檢視
Client端Filebeat配置
filebeat.prospectors:
- input_type: log
paths:
- /home/logs/app/business.log
- /home/logs/app/exception.log
json.message_key: log
json.keys_under_root: true
output.kafka:
hosts: ["10.82.9.202:9092","10.82.9.203:9092","10.82.9.204:9092"]
topic: filebeat_docker_java
複製程式碼
Kafka接收到的資料格式
{"@timestamp":"2018-09-05T13:17:46.051Z","appname":"app01","beat":{"hostname":"52fc9bef4575","name":"52fc9bef4575","version":"5.4.0"},"classname":"com.domain.pay.service.ApiService","date":"2018-09-05 21:17:45.953+0800","filename":"ApiService.java","hostname":"172.17.0.2","level":"INFO","linenumber":285,"message":"param[{\"email\":\"TEST@163.COM\",\"claimeeIP\":\"123.191.2.75\",\"AccountName\":\"\"}]","source":"/home/logs/business.log","thread":"Thread-11","timestamp":1536153465953,"type":"log"}
複製程式碼
Server端Logstash配置
input {
kafka {
bootstrap_servers => "10.82.9.202:9092,10.82.9.203:9092,10.82.9.204:9092"
topics => ["filebeat_docker_java"]
}
}
filter {
json {
source => "message"
}
date {
match => ["timestamp","UNIX_MS"]
target => "@timestamp"
}
}
output {
elasticsearch {
hosts => ["10.82.9.205", "10.82.9.206", "10.82.9.207"]
index => "filebeat-docker-java-%{+YYYY.MM.dd}"
}
}
複製程式碼
都是基礎配置很簡單,不做過多解釋,通過以上簡單的配置就能實現任何應用程式的日誌收集
日誌展示
收集日誌到elasticsearch之後,就可以通過kibana配置展示應用程式的日誌了,方便開發及時發現問題,線上定位問題
寫在最後
- 通用的基礎與前提是規範,規範做好了事半功倍
- 日誌列印Json格式不方便本地檢視?這個可以把日誌輸出格式當做配置寫在配置檔案中,不同環境載入不同配置,就跟開發環境載入開發資料庫一樣
- 日誌系統上線到現在穩定執行接近2年,除了剛開始有點不適應以為,都是越用越好用,現在他們已經離不開ELK日誌系統了,大大提高了工作的效率
如果你覺得文章對你有幫助,請轉發分享給更多的人。如果你覺得讀的不盡興,推薦閱讀以下文章: