天天看點

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

  • LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他
  • LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他
  • LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他
    Logstash+ElasticSearch+Kibana處理nginx通路日志
    • 1. nginx日志 -> logstash shipper -> redis
    • 2. redis -> logstash indexer -> elasticsearch
    • 3. elasticsearch -> kibana
    • 後續
    • 其他
      • 1. 關于logformat和對應grok的配置
      • 2. elasticsearch插件
      • 3. supervisor
      • 4. logstash坑

ELK

似乎是目前最為流行的日志收集-存儲-分析的全套解決方案.

去年年初, 公司裡已經在用, 當時自己還

山寨

了一個統計系統(postgresql-echarts, 日志無結構化, json形式存儲到postgresql, 建構統一前端配置生成, 調用統一查詢接口, 具體細節), 已經過了一年有餘.

一年剛好, 發生了很多事, 那套系統不知現在如何了.

在新的公司, 一切都得從0到1, 近期開始關注日志/資料上報/統計, 以及後續的資料挖掘等.

搭建, 測試并上線了一套簡單的系統, 初期将所有伺服器的nginx日志, 以及搜尋日志進行處理.

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

下面主要介紹對nginx日志進行處理的過程, 不是針對

elk

的介紹, 所有涉及ip的地方都改成

127.0.0.1

了, 根據自己環境進行修改

1. OSS日志 -> logstash shipper -> redis

資料接入和擷取

Elastic棧使用Logstash和Beats來進行資料的消化和擷取。

Logstash用jruby實作,有點像一個資料管道,把輸入的資料進行處理,變形,過濾,然後輸出到其它地方。Logstash 設計了自己的 DSL,包括有區域,注釋,資料類型(布爾值,字元串,數值,數組,哈希),條件判斷,字段引用等。

Logstash的資料管道包含三個步驟,Input,Filter和Output,每一步都可以通過plugin來擴充。另外Input和Output還支援配置Codecs,完成對輸入輸出資料的編解碼工作。

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

Logstash支援的常見的Input包含File,syslog,beats等。Filter中主要完成資料的變形處理,可以增删改字段,加标簽,等等。作為一個開源軟體,Output不僅僅支援ElasticSearch,還可以和許多其它軟體內建和目标,Output可以是檔案,graphite,資料庫,Nagios,S3,Hadoop等。

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

在實際運用中,logstash 程序會被分為兩個不同的角色。運作在應用伺服器上的,盡量減輕運作壓力,隻做讀取和轉發,這個角色叫做 shipper;運作在獨立伺服器上,完成資料解析處理,負責寫入 Elasticsearch 的角色,叫 indexer。

logstash 作為無狀态的軟體,配合消息隊列系統,可以很輕松地做到線性擴充。

Beats是 Elastic 從 packetbeat 發展出來的資料收集器系統。beat 收集器可以直接寫入 Elasticsearch,也可以傳輸給 Logstash。其中抽象出來的 libbeat,提供了統一的資料發送方法,輸入配置解析,日志記錄架構等功能。

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

開源社群已經貢獻了許多的beats種類。

因為Beats是使用Golang編寫的,效率上很不錯。

OSS  

log

通過

logstash shipper

讀取, 轉

json

, 發送到

redis

, 由後續的

logstash indexer

進行處理

步驟

1.在日志所在機器部署

logstash

2.在

logstash

安裝目錄下的

patterns

中加入一個檔案

nginx

内容(與上面的

log_format

相對應)

NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NOTSPACE:http_x_forwarded_for}
      

3.增加一個

logstash

配置檔案: 

logstash-project-access-log.conf

注意, input的file, filter的grok, output的redis-key

input {
    file {
        path => [ "/data/logs/nginx/xxxx_access.log" ]
        start_position => "beginning"
    }
    }

    filter {
    mutate { replace => { "type" => "nginx_access" } }
    grok {
        match => { "message" => "%{NGINXACCESS}" }
    }
    date {
        match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
    }
    geoip {
        source => "clientip"
    }
    }


    output {
    redis { host => "127.0.0.1" data_type => "list" key => "logstash:xxxx:access_log" }
    }
      

4.使用

supervisor

啟動

shipper

.

[program:logstash_xxxx_shipper]
    command=/var/shell/logstash/bin/logstash -f /var/shell/logstash/configs/nginx-xxxx-shipper.conf
    numprocs=1
    autostart=true
    autorestart=true
    log_stdout=true
    log_stderr=true
    logfile=/data/logs/logstash/logstash_xxxx_access.log
      

2. redis -> logstash indexer -> elasticsearch

注意, input的redis為上一步redis配置, key要對應, output的elasticsearch配置, 

index

指定了最終es中存儲對應的index, 加日期, 友善對日志進行定期删除

input {
redis {
    host => "127.0.0.1"
    port => "6379"
    key => "logstash:xxxx:access_log"
    data_type => "list"
    codec  => "json"
    type => "logstash-arthas-access"
    tags => ["arthas"]
}
}

output {
elasticsearch {
    host => "127.0.0.1"
    index => "logstash-arthas-access-%{+YYYY.MM.dd}"
}
}
      

分布叢集和擴充性

ElasticSearch

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

ElasticSearch是為分布式設計的,有很好的擴充性,在一個典型的分布式配置中,每一個節點(node)可以配制成不同的角色,如上圖所示:

  • Client Node,負責API和資料的通路的節點,不存儲/處理資料;
  • Data Node,負責資料的存儲和索引;
  • Master Node, 管理節點,負責Cluster中的節點的協調,不存儲資料。

每一種角色可以通過ElasticSearch的配置檔案或者環境變量來配置。每一種角色都可以很友善的Scale,因為Elastic采用了對等性的設計,也就是所有的角色是平等的,(Master Node會進行Leader Election,其中有一個是上司者)這樣的設計使得在叢集環境的伸縮性非常好,尤其是在容器環境,例如Docker Swarm或者Kubernetes中使用。

參考:

  • https://elk-docker.readthedocs.io/#elasticsearch-cluster
  • https://github.com/pires/kubernetes-elasticsearch-cluster

産品線

Elastic

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

Elastic的産品線除了大家熟悉的ELK(ElasticSearch,Logstash,Kikana),主要包含:

  • Beats Beats是一個開源元件,提供一個代理,把本地抓到的資料傳送到ElasticSearch;
  • Elastic Cloud, Elasti提供的雲服務;
  • X-Pack, Elastic的擴充元件,提供安全,告警,監控,機器學習和圖處理能力。主要功能需要付費使用

3. elasticsearch -> kibana

剩下的其實沒什麼了, 啟動

kibana

後, 配置好指向的

es

, 就可以在

kibana

中檢視到實時的日志資料

demo環境截圖

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

kibana

中, 支援各種統計, 着實讓人驚豔了一把.

除了基本的nginx日志, 還需要在各類url入口, 加入平台, 管道等資訊, 這樣通過nginx通路日志, 可以統計到更多的資訊

當然, 如果需要一些更為精确/特殊的統計, 需要自行進行資料上報的工作.

後續

  1. 更多的類型的日志聚合, 包括各類通路日志, 統計上報日志等, 日志落地成檔案, 永久留存, 轉入es中, 隻留存三個月
  2. 如何對各類資料進行拆分/彙總
  3. ELK整體部署/運維/擴容等, 包括資料清理
  4. 基于ES日志的業務自定義統計背景(kibana無法滿足一些具體業務的統計需求)
  5. 為什麼不使用

    logstash forwarder

    , 因為目前日志組成等較為簡單, 簡單處理 , 後續需要用到時再考慮

其他

1. 關于

logformat

和對應

grok

的配置

grok

logstash

的一個插件, 文檔

Grok is currently the best way in logstash to parse crappy unstructured log data into something structured and queryable

是以, 我們在處理

nginx

日志時, 需要根據具體

logformat

定義對應的

grok

表達式

除了上面例子中用的那套, 另一份

logformat

log_format logstash '$http_host '
                      '$remote_addr [$time_local] '
                      '"$request" $status $body_bytes_sent '
                      '"$http_referer" "$http_user_agent" '
                      '$request_time '
                      '$upstream_response_time';
      

patterns/nginx

NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:http_host} %{IPORHOST:clientip} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NUMBER:request_time:float} %{NUMBER:upstream_time:float}
      

如果想自行定義, 可以使用 grokdebug, 将要解析的日志和配置的正則放入, 可以檢視最終得到的結構化資料

2. elasticsearch插件

初期隻安裝了一個 kopf, web界面檢視

3. supervisor

建議使用

supervisor

elk

進行管理,(ps. 不要用yum自帶的, 版本太舊好多坑, 浪費1小時......使用pip install安裝最新版本即可)

配置示例

elk.conf

[program:elasticsearch]
command=/var/shell/elk/elasticsearch/bin/elasticsearch
numprocs=1
autostart=true
autorestart=true

[program:kibana]
command=/var/shell/elk/kibana/bin/kibana
numprocs=1
autostart=true
autorestart=true

[program:logstash_arthas]
command=/var/shell/elk/logstash/bin/logstash -f /var/shell/elk/logstash/config/xxxx_access.conf
numprocs=1
autostart=true
autorestart=true
log_stdout=true
log_stderr=true
logfile=/data/logs/elk/logstash/logstash_arthas_access.log
      

4. logstash坑

start_position => "beginning"
      

logstash, 會記錄一份檔案讀到的位置, 在$HOME/.sincedb_xxxxx 如果要讓logstash重新讀取檔案, 删除之即可, 重新開機

shipper

.

但是你可能發現es中重複記錄了, 這是因為, 在

output

中, 沒有定義存儲到es時使用的

document_id

, es全部當成新紀錄存入, 導緻資料重複

應團隊ELK使用需要,特寫了一篇Kibana 介紹 使用相關文章。

以下示範基于官方Kibana示範頁面:http://demo.elastic.co/packetbeat/#/discover

一、Kibana界面說明

    1.Discover頁面

    這個面闆主要提供了給使用者基于記錄做快速檢索,查詢框中輸入的查詢表達式為luence的query syntax. 在本文後面會分享一些常用的luence文法使用

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他
    1.1 時間區間選擇

          在查詢面闆中,一般預設是顯示最近15分鐘的資料。如果我們想查最近30分鐘、一周、一年或者從2010-01-01到2010-02-01等區間就可以用到這個功能。

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他
    1.2 自動重新整理

在日志量比較大的時候,我們檢視日志時一般會自己手動點選重新整理來檢視最新的資料。 那麼能不能偷下懶,讓Kibana來幫我們完成這個動作,也就是自動重新整理呢? 目前可以,請看下面:     

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

    2.Visualize頁面

可視化頁面可以基于查詢條件組合生成很多類型的圖表,例如:區域圖、資料表、折線圖、拼圖、豎向圖和能基于IP在地圖展示的拼貼圖等待,如下圖所示:

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他
    2.1 餅圖示範(基于通路IP分析)

    下面基于通路IP,統計了在15分鐘内通路TOP 50的用戶端分布。其他的圖表可以自己嘗試去玩玩看,都大同小異。

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

3.Dashboard頁面

這個頁面上可以将多個已儲存的圖表建立為一個Dashboard,用作大屏展示。還提供了ifame的方式能将指定Dashboard嵌入到其他你想顯示的頁面裡面。 多個圖表支援滑鼠拖動位置,同時還能標明指定區間資料進行細化檢視。都是挺好用的功能。 下面我們來從官方提供的Dashboard挑選兩個看看,對其他的感興趣的可以自行去: http://demo.elastic.co/packetbeat/#/dashboard?_g=() 檢視。

3.1 HTTP

這裡顯示總請求數、HTTP code分布數、按照時間序列柱狀圖展示、HTTP error分布、TOP N 請求等常用圖表展示,如下圖:

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他
3.2 MySQL performance

提供了查詢錯誤分布、CRUD以及ROLLBACK分布、MySQL讀寫、慢查詢SQL語句、TOP N 語句等常用圖表。

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

二、查詢文法

    1.全文檢索

         例子:在搜尋框中檢索和http相關的記錄          

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

    2.字段查詢

        2.1 精确比對

              字元串的話用英文雙引号括起來,例如:查詢server為app.server2的表達式為–>:server:”app.server2″

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他
    2.2 整形查詢
LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

其他的類似,隻不過特殊字元需要轉義。

  2.3 限定字段全文搜尋

    例如隻在path中檢索console存在的記錄,取消雙引号就好了。     

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

 3.範圍檢索(數字、時間)

        3.1 查詢輸出位元組數100~200之間的:bytes_out:[100 TO 200],可以用*代表無邊界。
LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他
    3.2 查詢時間區間

         這裡一般會存在時區的問題,相差8個小時,但是我們不影響我們查詢,查詢的時候也少8個小時就好了。         3.2.1 從指定時間到現在/或者查詢指定時間前資料 

        表達式如下:          dataField:{startTime TO endTime}  // 指定區間範圍

          dataField:{* TO endTime}               // 指定結束時間

          dataField:{startTime TO *}              // 指定開始時間

           比如查詢2016-06-30T09:20:41.943之後的資料,可以用:–>@timestamp:{2016-06-30T09:20:41.943Z TO *} , 上面是09:20:41事實上是17:20:41,8個小時差。

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他
    4.正則

查詢所有host非pub打頭的記錄,表達式為: –>  !host:/pub*/,前面的英文感歎号用作取反。

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

下面來個複雜點的,多個條件組合查詢。表達式為:

!host:”tjwq01-cp-net-neutron002204.tjwq01.ksyun.com” AND !host:”tjwq01-cp-control002193.tjwq01.ksyun.com” AND !host:”tjwq01*” AND !host:/pub*/

可用用AND和OR來做邏輯與、邏輯或,和RDBMS查詢意思一樣。

LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他
    5.邏輯操作
基于AND 和 OR做條件連接配接即可,
文法為:

condition1 AND condition2 OR condition3 比如: age:20 AND address:”beijing” OR address:”shanghai”

    6.存在/不存在
一條語句解釋兩個關鍵字: _exists_:host AND _missing_:bill , 表達的意思是查詢存在host并且沒有bill字段的記錄。
LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他
    7.特殊轉義字元
+ – && || ! () {} [] ^” ~ * ? : \
以上字元當作值搜尋的時候需要用\轉義

8.模糊搜尋

~:在一個單詞後面加上~啟用模糊搜尋
first~ 也能比對到 frist
還可以指定需要多少相似度,cromm~0.3 會比對到 from 和 chrome
數值範圍0.0 ~ 1.0,預設0.5,越大越接近搜尋的原始值
LOGSTASH+ELASTICSEARCH+KIBANA處理OSS通路日志 其他

9.近似搜尋

    在短語後面加上~     “select where”~3 表示 select 和 where 中間隔着3個單詞以内     拓展閱讀:     0.《Elasticsearch 權威指南(中文版)》 http://es.xiaoleilu.com/index.html     參考資料:     0.《ELK:kibana使用的lucene查詢文法》 https://segmentfault.com/a/1190000002972420     1.《ELK kibana查詢與過濾(17th)》 http://www.ttlsa.com/elk/elk-kibana-query-and-filter/     2.《Kibana示例》 http://demo.elastic.co/packetbeat/