ELK日誌系統之通用應用程序日誌接入方案

前邊有兩篇ELK的文章分別介紹了MySQL慢日誌收集Nginx訪問日誌收集,那麼各類不一樣類型應用程序的日誌該如何方便的進行收集呢?且看本文咱們是如何高效處理這個問題的java

日誌規範

規範的日誌存放路徑和輸出格式將爲咱們後續的收集和分析帶來極大的方便,無需考慮各類不一樣路徑、格式的兼容問題,只須要針對固定幾類日誌作適配就能夠了,具體的規範以下:web

日誌存放路徑規範spring

  1. 項目日誌只能輸出到固定的位置,例如/data/logs/目錄下
  2. 同一類型(例如java web)的日誌文件名保持統一,例如都叫application.log
  3. 一個類型的項目能夠記錄多個不一樣的日誌文件,例如exception.logbusiness.log

日誌輸出格式規範docker

  1. 日誌輸出必須爲JSON格式,這個很重要
  2. 同一類型的項目應採用統一的日誌輸出標準,儘可能將日誌輸出模塊化,全部項目引用同一模塊
  3. 輸出日誌中必須包含標準時間(timestamp)、應用名稱(appname)、級別(level)字段,日誌內容記錄清晰易懂

日誌信息級別規範數據庫

日誌級別 說明 數值
debug 調試日誌,日誌信息量最多 7
info 通常信息日誌,最經常使用的級別 6
notice 最具備重要性的普通條件信息 5
warning 警告級別 4
error 錯誤級別,某個功能不能正常工做 3
critical 嚴重級別,整個系統不能正常工做 2
alert 須要馬上修改的日誌 1
emerg 內核崩潰等嚴重信息 0

從上到下級別依次從低到高,日誌量從多到少,正確選擇日誌級別幫助後期快速排查問題json

咱們爲何要制定這樣的規範?

  1. 咱們的項目都跑在Docker裏,Docker鏡像由基礎鏡像+項目代碼組成
  2. 基礎鏡像打包了運行項目的基礎環境,例如spring cloud微服務項目,則打包了jre服務
  3. 規範了日誌存放及輸出後,咱們能夠把做爲日誌收集agent的filebeat一併打包進基礎鏡像,由於同一類型項目的日誌路徑、格式都是一致的,filebeat配置文件能夠通用
  4. 這樣咱們在後續的部署過程當中就不須要關心日誌相關的內容,只要項目鏡像引用了這個基礎鏡像就能自動接入了咱們的日誌服務,實現日誌的收集、處理、存儲與展現

日誌採集

咱們通用日誌採集方案以下圖: bootstrap

  1. 程序跑在容器裏,容器內自帶Filebeat程序收集日誌
  2. 收集完成後傳給kafka集羣,logstash讀取kafka集羣數據寫入elasticsearch集羣
  3. kibana讀取elasticsearch集羣數據展現在web上,開發、運維等須要查看日誌的用戶登陸kibana查看

Client端Filebeat配置bash

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接收到的數據格式app

{"@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配置展現應用程序的日誌了,方便開發及時發現問題,在線定位問題

寫在最後

  1. 通用的基礎與前提是規範,規範作好了事半功倍
  2. 日誌打印Json格式不方便本地查看?這個能夠把日誌輸出格式當作配置寫在配置文件中,不一樣環境加載不一樣配置,就跟開發環境加載開發數據庫同樣
  3. 日誌系統上線到如今穩定運行接近2年,除了剛開始有點不適應覺得,都是越用越好用,如今他們已經離不開ELK日誌系統了,大大提升了工做的效率

長按關注公衆號查看更多原創文章

若是你以爲文章對你有幫助,請轉發分享給更多的人。若是你以爲讀的不盡興,推薦閱讀如下文章:

相關文章
相關標籤/搜索