ELK是當下流行的日誌監控系統。ELK是Elasticsearch、Logstash、Kibana三個軟件的統稱。php
在ELK日誌監控系統中,Logstash負責讀取和結構化各種日誌+發送給Elasticsearch,Elasticsearch負責存儲Logstash發送過來的日誌+響應Kibana的查詢,Kibana負責從Elasticsearch查詢內容+在web界面中向用戶展現。html
ELK看是三個工具,可是都至關於」綠色軟件「,基本都是下載解壓就能運行了。java
下載地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlnode
下載地址:https://www.elastic.co/downloads/elasticsearchpython
tar -zxf elasticsearch-6.4.2.tar.gz cd elasticsearch-6.4.2/ # 之後臺方式啓動 bin/elasticsearch -d -p pid.log # 啓動須要點時間,稍等一下再執行下一句 curl http://localhost:9200/
若是有如圖json結果返回,那就說明安裝成功。web
能夠弄個啓停腳本,免得每次啓停都得想一個需不須要帶參數帶什麼參數:正則表達式
# 啓動腳本 echo './elasticsearch -d -p pid.log' > start__elasticsearch chmod u+x start__elasticsearch # 中止腳本,直接用kill -9殺除進程 echo 'kill -9 `cat ../pid.log`' > stop_elasticsearch chmod u+x stop_elasticsearch
下載地址:https://www.elastic.co/downloads/logstash數據庫
cd logstash-6.4.2/ cat > config/logstash.conf << EOF input { file { path => ["/var/dpkg.log"] start_position => "beginning" } } filter { if [path] =~ "access" { mutate { replace => { "type" => "apache_access" } } grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } } date { match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] } } output { elasticsearch { hosts => ["localhost:9200"] } stdout { codec => rubydebug } } EOF nohup bin/logstash -f config/logstash.conf &
能夠弄個啓停腳本,免得每次啓停都得想一個需不須要帶參數帶什麼參數:apache
# 啓動腳本,配置文件名改爲本身的 echo 'nohup ./logstash -f ../config/logstash.conf &' > start__logstash chmod u+x start__logstash # 殺除進程腳本 echo 'kill -9 `ps -ef |grep logstash |grep -v grep| awk "{print $2}"|head -n 1`' > stop_logstash chmod u+x stop_logstash
下載地址:https://www.elastic.co/downloads/kibanajson
解壓後編緝config/kibana.yml,將server.host項修改成本機ip,將elasticsearch.url項賦值爲elasticsearch地址。如我這裏是:
server.host: "10.10.6.92" elasticsearch.url: "http://localhost:9200"
保存後啓動:
nohup bin/kibana &
啓動後默認監聽5601端口,使用http://{ip}:5601訪問便可,界面以下圖所示:
能夠直接弄個啓停腳本,免得每次啓停都得想一個需不須要帶參數帶什麼參數:
# 啓動腳本 echo 'nohup ./kibana &' > start_kibana chmod u+x start_kibana # 中止腳本,直接用kill -9殺除進程 echo 'kill -9 `ps -ef |grep ./../node/bin|grep -v grep|awk "{print $2}"|head -n 1`' > stop_kibana chmod u+x stop_kibana
在上一節中咱們對ELK安裝配置並運行了起來,這節咱們進一步探究ELK更高級的配置和用法。
本節主要參考頁面:https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html
logstash配置主要就是config/logstash.conf文件中的input/filter/output三大節區,其中input用於指示logstash從何處讀取,filter節區指示logstash如何結構化(格式化)輸入,output節區指示logstash輸出到哪裏。這三大節區的成員都是插件,下邊分別講述各節區支持的插件及插件配置。
input節區全部插件參見:https://www.elastic.co/guide/en/logstash/current/input-plugins.html
在1.3節中咱們使用的就是file插件,這裏就以file插件爲例講解其爲何能夠這麼配置,還能夠怎麼配置。
在上邊插件頁面中點擊file插件連接便可進入file插件說明頁面,以下所示
進入後直接下接到"File Input Configuration Options"節(xxx插件就下拉找到xxx Input Configuration Options節)
Setting列----插件支持的配置項的名稱
Input type列----該配置項的值的格式。包插number(數字)、string(字符串)、array(數組)等幾種類型
Required列----該配置項是否必須配置。No表示非必須,Yes表示必須
往下拉能夠看到咱們前面file插件配置path和start_position,能夠看到path是數組類型且是必須的,而start_position是字符串類型(只能是」beginning「或」end「)不是必須的。
再點擊配置項連接能跳轉到配置項的詳細說明。各插件都相似以上步驟查看便可。
input最經常使用的插件感受是file和stdin,格式以下:
input { file { path => ["/home/ls/test.txt"] start_position => "beginning" } stdin { } }
filter節區全部插件參見:https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
在1.3中咱們配置了mutate、grok和date三個插件,多個插件組成一個插件鏈;好比這裏輸入先被mutate處理,再被傳到grok處理,再被傳到date處理。
所謂的」處理「是一個關鍵,咱們將config/logstash.conf修改成以下內容(表示從標控制檯獲取輸入、不使用任何插件、輸出到控制檯)並從新啓動logstash
input { stdin { } } filter { } output { stdout { codec => rubydebug } }
咱們輸入以下一條http訪問日誌:
127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0"
以下{}中的json就是logstash的輸出,共message(信息原文)、@version(信息版本)、@timestamp(信息接收時間)、host(信息來源主機)四項。
首先,咱們在filter{}中加入如下一個規則(指示以apache日誌格式進行解析message項),並重啓logstash並再次輸入前邊的http日誌
grok { match => { "message" => "%{COMBINEDAPACHELOG}" } }
輸出結果以下,能夠看到在原來那四項的基礎上,增長了不少項
而後,咱們在filter{}中再加入如下一個規則(指示以"dd/MMM/yyyy:HH:mm:ss Z"解析timestamp項,並重寫爲"yyyy-MMM-dd HH:mm:ss Z"格式),並重啓logstash並再次輸入前邊的http日誌
date { match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ,"yyyy-MMM-dd HH:mm:ss Z"] }
能夠看到@timestamp項被成功按指定格式重寫
最後,在filter{}中再加入如下一個規則(指示新增一個叫new_filed的項,其值爲固定值」this is a new field「),此時完整配置文件以下:
input { stdin { } } filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } date { match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] } environment { add_field => { "new_field" => "this is a new field" } } } output { stdout { } }
因爲environment插件默認沒有安裝咱們先安裝一下(全部插件均可以使用logstash-plugin命令進行管理,相似yum或apt)
bin/logstash-plugin install logstash-filter-environment
此時重啓logstash並再次輸入前邊的http日誌再次在控制檯輸入上邊的http訪問日誌,輸出結果以下。能夠看到按預期新增了一個叫」new_field「的項
從如上分析能夠得出如下結論:
logstash默認對傳來的信息進行初步處理,生成message(信息原文)、@version(信息版本)、@timestamp(信息接收時間)、host(信息來源主機)四個鍵
後面的插件前面的插件生成的結果,以鍵值對爲操做單無,或是修改已有鍵值對或是新增鍵值對。
最後,全部filter插件都支持如下選項
filter最經常使用的是將非結構化數據進行結構化的grok,因爲篇幅較長分離了出去,見後邊第四大點「從自定義文件解析IP並可視化」。
output節區全部插件參見:https://www.elastic.co/guide/en/logstash/current/output-plugins.html
在ELK中最經常使用的就是咱們1.3中設置的,輸出到elasticsearch
elasticsearch { hosts => ["localhost:9200"] }
elasticsearch會自動完成數據接收,而後kibana來查詢時會自動響應,就單個來講沒有其餘太多的配置。主要的配置是在集羣方面(cluster)但集羣沒研究因此這裏就不介紹了。
另一個是配聽公網地址,elasticsearch默認只監聽127.0.0.1,若是要監聽其餘地址須要打開其config/ elasticsearch.yml,修改network.host的值。比直接監聽全部地址:
network.host: 0.0.0.0
可是不是隨便改完重啓就完了,elasticsearch默認認爲當前是開發環境,若是修改network.host監聽127.0.0.1之外的地址,那麼elasticsearch就認爲是遷移到了生產環境。
在開發環境中若是這些項沒有按要求配置那麼只視爲異常,但到生產環境這些項若是沒按要求配置那將會被視爲錯誤elasticsearch將拒絕啓動。也就是說要修改監聽地址成功,除了要修改network.host項還要保證這些項已按要求配置。
在2.4中咱們只是把kibana運行起來,雖然說kibana接收了elasticsearch的數據,但並無展現這些數據,下面咱們就來介紹如何展現數據。
切換到Discover菜單,默認會顯示kinaba接收到的全部數據,」Available fields「那裏是當前全部數據出現過的全部項,點擊它們可經過他們進行數據篩選。
便可看到全部kibana支持的圖表,咱們這裏以pie爲例
Filter表示輸入過濾表達式,篩選出要參與圖表繪製的數據集,咱們這裏直接點下方建議的「logstash-*」(這是咱們前面3.2創建索引的全部數據)
進入後正中央一個大環表示全部數據、左下方的「Split Slices」和「Split Chart」用於添加分割指標、左上方播放按鈕用於分割指標效果預覽,右上方「Save」菜單用於保存圖表。
所謂的分割指標其實主要就是咱們logstash生成的好些項,把他們以大於、小於、等於某個值進行分類。
如下是一個創建完的效果圖
在可視化圖表中,最主要的事情就是兩件:一是指定如何分類(Buckets),二是指定以什麼做爲度量(Metrics)。
好比在上圖中咱們以timestamp項以年(Yearly)爲基準進行分類,而後以數量(Metrics中設置爲Count)做爲度量(具體到這裏就是timestamp項各年出現的次數),造成了上邊的餅狀圖。
分類(Buckets)和度量(Metrics)通常都是先選Aggregation再選Field,再選Field的一些細化選項。
Aggregation----類型的意思好比是日期類型(date histogram)仍是範圍類型(range),這只是一個大致的分類,隨便選選就好了。
Filed----就是前面說的logstash的那些項(固然logstash的項和kibana中的項只有在建索引後才能算是一回事,見下文4.3 kibana IP地理可視化),好比timestamp啦host啦,按這些項分類或排序或統計可視化圖表怎麼創建和配置就很明瞭了。
Field的一些細化選項----就是一些細化限制,本身隨便多點點就知道了。
所謂儀表盤就是,就是可視化圖表的集合。用3.3.4的方法建立一個pie(命名爲test pie)再建立一個bar(命名爲test bar)咱們這裏以把它們加載到新建的儀表盤爲例
全點擊加載上來
咱們能夠隨意改變加載進來的圖表的位置和大小,最後點擊「Save」保存便可。這就是所謂的儀表盤,感受和zabbix是同樣的玩法。
數據庫下載地址:https://dev.maxmind.com/geoip/geoip2/geolite2/
在3.1.2中咱們說明了三個關鍵點:多個插件是以插件鍊形式運行的,後續插件以其前插件生成的項爲操做單元,及如何查看插件文檔。但本身想了一下經過看文檔知道插件選項怎麼寫這個答案是不能使人滿意的,同時grok解析自定義文本文檔是常見的須要咱們就以此爲例進行演示。
生成的內容形以下,咱們使用grok插件編寫規則,解析出ip、端口、協議三項:
75.207.190.84:1530 udp
在config目錄下建立patterns文件夾,再在patterns下建立patterns.conf文件,在其下寫入如下內容(其實就至關於正則宏定義):
正則表達式在線測試網址:http://tool.chinaz.com/regex/
grok解析表達式在線測試網址(推薦在這裏測過了再寫):http://grokdebug.herokuapp.com
MYIP (\d+\.+){3}\d+ MYPORT \d{1,5} MYPROTO (t|u){1}(c|d){1}p
在logstash.conf中寫入如下內容(格式要點說明都在註釋中,另外注意按本身的修改文件路徑):
input { stdin { } } filter { # 在真正使用時一般會接收來自不一樣地方不一樣格式的文件,此時就要限定插件對哪些來源啓用而對哪些來源不啓用,由於使用格式去解析不匹配的文件那是解析不了的就會報錯
# 後邊啓用些限制,只有path項中爲test.txt文件才使用此規則。這裏是在控制檯調試因此先註釋掉 # if [path] =~ "test.txt" { grok { # 這裏是自定義正則的文件夾 patterns_dir => ["/usr/myapp/elk/logstash-6.4.2/config/patterns"] # 這條規則的意思是,針對前面的「message」項的內容,使用"%{MYIP:myip}:%{MYPORT:myport} %{MYPROTO:myproto}"格式進行解析 # MYIP/MYPORT/MYPROTO咱們自定義的正則規則,myip/myport/myproto三項表示其前正則解析出的內容賦給這些項 # =>後的規則不要求能解析完整個項,但必定要是從頭連續解析;好比能夠只要match => { "message" => "%{MYIP:myip}} # 但不能是跳過端口:match => { "message" => "%{MYIP:myip} %{MYPROTO:myproto}"} # 其實的:和空格不是隨意的是由於不用正則的地方要原樣保留75.207.190.84:1530 udp中咱們的正則沒處理其中的:和空格要原樣保留 match => { "message" => "%{MYIP:myip}:%{MYPORT:myport} %{MYPROTO:myproto}"} # 若是不想用文件夾也能夠直接把規則寫在這裏,好比上邊這條規則直接寫在這裏的等價形式爲 # match => { "message" => "(?<myip>(\d+\.+){3}\d+):(?<myport>(\d{1,5}) %(?<myproto>((t|u){1}(c|d){1}p)"} } # } } output { stdout { } }
在下圖中能夠看到對於輸入「75.207.190.84:1530 udp」,ip、端口和協議都已按預期成功提取
另外咱們還輸入了按%{MYIP:myip}:%{MYPORT:myport} %{MYPROTO:myproto}格式不能解析的「dd」,此時報錯[0] "_grokparsefailure"。這就是上方配置註釋中強調針對來源啓用插件的緣由。
首先要下載GeoLite2數據庫,下載地址:https://dev.maxmind.com/geoip/geoip2/geolite2/
這幾個的區別是精度的區別ASN精確到自治域,Country精確到國家,City精確到城市。咱們直接下載城市版,而後解壓
按流程來說仍是得要在stdin{}和stdout{}調試一翻,完後再寫真正配置,但這裏爲了節省篇幅混合在一塊兒進行。
修改logstash.conf爲如下內容,而後啓動logstash:
input { file { # 存放python生成的那些東西的文件的位置,根據本身的修改 path => ["/home/ls/test.txt"] start_position => "beginning" } } filter { # 只有path項中爲test.txt文件才使用此規則 if [path] =~ "test.txt" { grok { # 這裏是自定義正則的文件夾,根據本身的修改 patterns_dir => ["/usr/myapp/elk/logstash-6.4.2/config/patterns"] # 這條規則的意思是,針對前面的「message」項的內容,使用"%{MYIP:myip}:%{MYPORT:myport} %{MYPROTO:myproto}"格式進行解析 # MYIP/MYPORT/MYPROTO咱們自定義的正則規則,myip/myport/myproto三項表示其前正則解析出的內容賦給這些項 # =>後的規則不要求能解析完整個項,但必定要是從頭連續解析;好比能夠只要match => { "message" => "%{MYIP:myip}} # 但不能是跳過端口:match => { "message" => "%{MYIP:myip} %{MYPROTO:myproto}"} # 其實的:和空格不是隨意的是由於不用正則的地方要原樣保留75.207.190.84:1530 udp中咱們的正則沒處理其中的:和空格要原樣保留 match => { "message" => "%{MYIP:myip}:%{MYPORT:myport} %{MYPROTO:myproto}"} # 若是不想用文件夾也能夠直接把規則寫在這裏,好比上邊這條規則直接寫在這裏的等價形式爲 # match => { "message" => "(?<myip>(\d+\.+){3}\d+):(?<myport>(\d{1,5}) %(?<myproto>((t|u){1}(c|d){1}p)"} } # 這裏能夠仍是須要放if內進行限制,咱們要對「myip」鍵進行處理,只有通過上邊grok處理的纔會有myip鍵 # 其餘消息沒有myip,處理時不會自動跳運而是同樣報[0] "_geoip_lookup_failure" geoip{ # 指定要進行地址轉換的字段----固然只能是ip字段,咱們這裏是myip source => "myip" # 下載的geoip數據庫文件的位置,根據本身的修改 database => "/usr/myapp/elk/logstash-6.4.2/config/GeoLite2-City_20181016/GeoLite2-City.mmdb" } } } output { elasticsearch { hosts => ["localhost:9200"] } # 輸出到控制檯是爲了調試用的,到真正配時註釋掉 stdout{} }
咱們使用如下python代碼生成多一些和」75.207.190.84:1530 udp「格式同樣的數據,生成後保存到/home/ls/test.txt(保存到哪均可以只要和input中file插件設置的位置一致)
for i in range(100): print(f"{random.randint(1,255)}.{random.randint(1,255)}.{random.randint(1,255)}.{random.randint(1,255)}:{random.randint(1000,2000)} tcp") print(f"{random.randint(1,255)}.{random.randint(1,255)}.{random.randint(1,255)}.{random.randint(1,255)}:{random.randint(1000,2000)} udp")
因爲咱們輸出到stdout{}(用nohub啓動的能夠查看nohub.out),此時能夠在控制檯看到相似如下輸出。「110.40.27.195」這個IP被成功解析爲中國北京。
在第三大節中咱們建立了index,所謂index就是給logstash生成的那些鍵在kibana中設定爲索引。如今myip等項和geoip的各項都是新加進來的,在kibana中就尚未對應索引因此咱們須要從新建一個索引。
對於任何新增的項,都須要新建index才能將將其做爲可視化圖表中的「維」來使用。
取定好數據集,我這裏取定爲logstash-2018.10.*,除了昨天和今天的數據集logstash-2018.10.18和logstash-2018.10.19,明天傳來的數據會保存爲logstash-2018.10.20,因爲能匹配上因此也會自動包含進去。11月的數據爲logstash-2018.11.x因爲匹配不上因此就不會被包含了,這就是所謂「index pattern」的意思。
此時咱們再到Visualize建立一個Region map
選用新建的索引
如圖所示,咱們以國家代碼(geoip.country_code2)進行分類,而後以數量爲其度量,就生成了如下圖表
參考:
https://blog.csdn.net/KingBoyWorld/article/details/78555120
https://blog.csdn.net/kingboyworld/article/details/77814528
https://www.elastic.co/downloads/logstash