2017年9月14日 星期四

ELK 設定與除錯

關於 Elasticsearch , 一開始是沒有打算使用這麼複雜的解決方案的.

前一陣子用 php + monolog 將公司內的系統操作記錄以文字方式存成 log file, 原本是打算自己寫程式來處理. 但一來是考慮效能問題, 再者也想說這種東西應該有現成的工具可以處理, 所以就找了一些資料.

結果先是看到 logstash , 然後發現這東西似乎不是單獨運作的, 最後就變成嘗試  Elasticsearch + Kibana + Logstash + Filebear 這種複雜架構了.

安裝環境是 ubuntu 17.04 , 如果處理的目標是常見的 log format  (e.g. apache),  那照 這篇文章 幾乎不會遇到問題就安裝設定完成了.

我照著做遇到的問題, 大概只有以下地方
  1. 我偷懶, 沒設定 filebear 和 logstash 透過 ssl  , 結果不透過 ssl 的話, 從 filebear 的 log 來看,    logstash 會拒絕 filebeat 傳來的資料.
  2. 還是我偷懶, 文章沒看完. 在 Kibana 的操作介面上, 要修改 index pattern 的名稱.
    我漏了這段, 所以一直看不到資料.
  3.  grok pattern 設定的問題, 基本上可以用文章的 logstash 設定方式, 只是會無法照自己意思去產生需要的欄位, 所以需要自訂 grok pattern .

其實一開始我還搞不清楚這幾個套件的關聯/架構 , 就照著文件硬幹下去.  後來遇到問題反覆查資料才弄清楚.
  1. logstash :  依指定 pattern 來 parse log  , 將結果轉到 elasticsearch
  2. elasticsearch : 存放最後資料的地方 ,  支援 RESTFul 的操作方式
  3. kibana : elasticsearch 的 web 操作介面, 透過 RESTFul 和 Elasticsearch 溝通
  4. filebear :  將 log file 內容透過 network 傳給 logstash . 
    filebeat 並非必要, 尤其如果 logstash 和 log file 在同一台機器上時.
  5. grok :  logstash parse log file 的工具,  透過 grok 來設定的 pattern 來 parse log file



grok 的部份

我的 log file format 大致上像這樣:

[2017-09-11 10:34:25] duan.INFO: user add {"id":"106","ip":"10.0.0.1","name":"test","group":"1","page":"adduser"} {"sql":"insert into user values(NULL, 'test', 'test', '334', '2', NULL, '1', 'test@example.com.tw')"}


各欄位描述大約如下:

["時間"]  
"操作者"."log level"
"user action"
"user infomation" (json format)  
"extra information" (json format, 是一些額外的資訊, 例如該 action 實際的 sql 語法)


我先查了一下網路上別人提供用來 parse monolog 的 pattern , 然後依照自己的 format 修改. 這個測試 grok pattern 的網站很有幫助.
這介面可以設定     log format sample , parse patterns , custom patterns

log format sample 就是上面貼的 log 內容,  後面兩個要用實際例子說明一下.


grok {
  patterns_dir => ["/etc/logstash/patterns"]
  match => { "message" "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:logger}.%{LOGLEVEL:level}: %{MYWORD:action} %{MYJSON:userinfo} %{GREEDYDATA:extra}" }
}


message 後面的那串就是用來 parse log 的 pattern  , 而  TIMESTAMP_ISO8601  DATA  LOGLEVEL 等等, 是 grok 內建定義好的 pattern

而  MYWORD  MYJSON 這些則是我自己定義的 pattern ,  設定的檔案放在  /etc/logstash/patterns/ 下,  內容是


MYWORD [a-zA-Z ]*    #連續的英文字或空白
MYJSON {[^}].*}    # 以  { } 包圍的連續字串

一般來說, 大部份情況可以直接透過 grok 內建定義好的 pattern 來 parse log file
但因為我是先自己寫程式用 monolog 去產生 log file, 才來找工具 parse ,  所以沒有事先規劃好就變成要自己寫 pattern 了.

設定 custom pattern 的方法
grok 內建的 pattern


debug 的方式

filebeat 和  logstash 雖然都有自己的 log file, 不過我這邊 logstash 似乎沒設定好,  log 的內容很簡略

1. 如果要看 logstash 是否有正確 parse 資料, 可以在 output 設定裡加上

stdout { codec => rubydebug }

然後以手動方式執行 logstash  (而不是 service logstash start 這種方式)

/usr/share/logstash/bin/logstash --path.settings /etc/logstash --debug


如果 filebeat 有送資料來且有正確處理的話, 就會看到資料 parse 的結果

2. 有時候 log 成長的速度很慢, 但為了測試 filebeat 和 logstash 之間的運作, 會希望把整個  log file 重新送出
單純重啟 filebeat 是沒用的, 因為它會記得前一次處理到那邊 ( file point offset)  ,  所以要清掉它記錄相關資料的檔案


a. service filebeat stop
b. rm /var/lib/filebeat/registry   (該檔案路徑可以在  filebeat 本身的 log file 看到, 或者從設定檔也可找到)
c. service filebeat start


3. 清掉  elasticsearch 的資料
因為 elasticsearch 是 RESTFul 架構, 所以很多操作可以透過 curl 進行

curl -X DELETE 'http://localhost:9200/_all'



沒有留言: