寫給大忙人的CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日誌集成環境搭建完整指南 ELK最新版6.2.4學習筆記-Logstash和Filebeat解析

如今的公司因爲絕大部分項目都採用分佈式架構,很早就採用ELK了,只不過最近由於額外的工做須要,仔細的研究了分佈式系統中,怎麼樣的日誌規範和架構纔是合理和可以有效提升問題排查效率的。通過仔細的分析和研究,肯定下面的架構應該是比較合理的之一(Filebeat也支持直接寫到ES),若是能夠的話,Filebeat也能夠不直接連到Logstash,先寫到kafka,而後從kafka寫到logstash的kafka插件。關於ELK的各類架構以及優缺點,能夠參考https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html。html

 

首先,不論是不是分佈式架構,都應該解決請求日誌上下文關聯的問題,這能夠經過Log4j自帶的NDC來實現。以Spring MVC爲例,可使用HandlerInterceptor在HandlerInterceptor中設置NDC.push(SessionBeanUtil.getSessionKey(request).substring(0, 8) + "_" + path + "_" + formatter.format(new Date()));,在postHandle中NDC.pop();。java

注:最近在學習spring cloud,spring cloud sleuth也包含了MDC跨節點日誌上下文跟蹤ID的特性,和筆者的思路基本一致。node

其次,對於分佈式請求,還要解決全局的請求日誌上下文關聯的問題,這須要依賴與具體的RPC框架來實現,以dubbo爲例,能夠經過filter在請求端和服務端設置。linux

第三,服務的調用鏈應該能夠算作是日誌框架的範疇,這能夠經過zipkin集成來實現。git

在實現上,對於服務的調用鏈可使用單獨的ES存儲、也能夠在一個大的ES集羣中存儲爲一個index。github

從ELK 6.0開始,對於源是log4j的場景,再也不建議使用logstash-input-log4j,而是使用Filebeat做爲應用端的日誌代理,具體能夠參考https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html。web

因此,在本文的搭建過程當中,筆者採用的也是Filebeat的方案。spring

環境說明與準備

Filebeat通常安裝在產生日誌的服務器,這裏tomcat在windows 10 x64下,因此Filebeat也須要安裝在windows下。chrome

CentOS 7.4 64位 ip 192.168.230.128,ELK安裝在centos下,統一安裝在/usr/local/app目錄下。shell

版本爲安裝時的最新版本:

Elasticsearch 6.2.4

Kibana 6.2.4

Logstash 6.2.4

從https://www.elastic.co/cn/downloads下載並解壓,以下:

由於ES主要經過restful api對外提供服務,因此通常安裝ES時順帶安裝elasticsearch-head,它提供了web控制檯。elasticsearch-head經過源碼的方式託管在git上,因此須要安裝下git,同時elasticsearch-head是一個nodejs應用,因此還須要具備node。

因此在正式開始前,咱們須要確保centos下下列基礎設施已經具有:

一、git已經安裝。yum install git

二、若是但願源碼安裝nodejs,確保gcc知足node的要求,或者直接使用已經編譯好的版本, 筆者直接使用編譯好的版本,可從https://nodejs.org/en/download/releases/選擇具體的版本,基礎運行環境最好不要使用最新版本,這裏咱們使用v4.9。下載解壓後便可用。

三、由於elk不能使用root運行,因此須要新建一個elk用戶並設置環境變量。

groupadd elk

useradd -g elk elk

設置elk用戶的環境變量:

su - elk

vim .bash_profile  增長以下:

export NODE_HOME=/usr/local/app/node-v4.9.1-linux-x64
PATH=$NODE_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_modules
export PATH
四、下載ELK套件自己並解壓:

cd /usr/local/app

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz

wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-linux-x86_64.tar.gz

wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.4.tar.gz

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-linux-x86_64.tar.gz

git clone https://github.com/elastic/elasticsearch-head.git 

六、由於ES和logstash都是java應用,因此確保安裝了JDK 1.8,可使用centos自帶的openjdk,不過生產環境下通常不建議使用openjdk,此處僅爲了測試方便。

ELK環境搭建

由於使用的是vmware,總共內存才分配了1G,因此爲了不OOM,對ES以及logstash內存均進行了調整,限制爲256M。

ES安裝

由於es須要非root用戶運行,因此對於ES相關的全部操做均在elk用戶下運行。

su - elk

更改ES配置:

[elk@elk1 ~]$ cd /usr/local/app/elasticsearch-6.2.4/config/
[elk@elk1 config]$ ll
總用量 16
-rw-rw----. 1 elk elk 2976 6月 1 16:22 elasticsearch.yml
-rw-rw----. 1 elk elk 2771 6月 2 13:54 jvm.options
-rw-rw----. 1 elk elk 5091 4月 13 04:33 log4j2.properties
[elk@elk1 config]$ pwd
/usr/local/app/elasticsearch-6.2.4/config

vim elasticsearch.yml

# 確保下列參數被正確設置:

cluster.name: logger   # ES集羣的名字

node.name: node-1

path.data: /usr/local/app/elasticsearch-6.2.4/data

path.logs: /usr/local/app/elasticsearch-6.2.4/log

bootstrap.memory_lock: false   # 對於非專用ES,建議設置爲false,默認爲true
bootstrap.system_call_filter: false

network.host: 0.0.0.0  # 支持遠程訪問

http.port: 9200 # restful api訪問接口

http.cors.enabled: true      #容許ES head跨域訪問
http.cors.allow-origin: "*"   #容許ES head跨域訪問

vim jvm.options # JVM參數在這個文件中設置,固然命令行也能夠

-Xms256m
-Xmx256m

上述配置調整完成後,就能夠啓動ES了。

[elk@elk1 bin]$ nohup ./elasticsearch &

[elk@elk1 bin]$ ps axu | grep elas

windows下瀏覽器訪問下http://192.168.230.128:9200/

這樣,ES就安裝好了。

ES head安裝

須要注意的是,雖然ES head能夠認爲是es的插件,可是它不能放在$ES_HOME/plugins目錄下,由於它並不符合ES插件的規範,不然ES啓動會失敗。

[elk@elk1 elasticsearch-head]$ pwd
/usr/local/app/elasticsearch-head
[elk@elk1 elasticsearch-head]$ npm config set registry https://registry.npm.taobao.org

npm install

Please report this full log at https://github.com/Medium/phantomjs

npm ERR! Darwin 15.0.0

npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install"

npm ERR! node v4.4.3

npm ERR! npm  v3.10.9

npm ERR! code ELIFECYCLE

npm ERR! phantomjs-prebuilt@2.1.14 install: `node install.js`

npm ERR! Exit status 1

npm ERR! 

npm ERR! Failed at the phantomjs-prebuilt@2.1.14 install script 'node install.js

若是出現上述錯誤,則執行下列名稱:

npm install phantomjs-prebuilt@2.1.14 --ignore-scripts

而後從新執行

npm install

這樣ES head就安裝好了。不要急着啓動!!!

若是隻是本機訪問,下面的配置修改不是必須的。若是要其餘機器訪問,則須要修改,通常來講,只要是服務器應用,都是經過遠程訪問的。

[elk@elk1 elasticsearch-head]$ vim Gruntfile.js

搜索server,在其options對象屬性下增長一個hostname屬性,值爲"*",以下:

如今就能夠啓動es head了,以下:

 訪問下http://192.168.230.128:9100/吧,以下:

這裏狀態爲yellow的緣由在於默認狀況下,Elasticsearch爲每一個索引分配5個分片和1個副本(5個主分片,5個副本分片),也就是雙節點模式,而咱們只有一個節點。

 

logstash安裝

logstash和kibana可使用root用戶來啓動。

建立一個logstash配置文件,好比logstash-es.conf,配置從filebeat讀取數據源,輸出到es,爲了簡化起見,忽略過濾器(實際生產中,通常須要配置過濾器對日誌進行規範化處理和分類)

cd /usr/local/app/logstash-6.2.4/config

[elk@elk1 config]$ vim logstash-es.conf

input {
  stdin { }
  beats {
    port => 5000
    ssl => false
  }
}
output {
    elasticsearch {
        action => "index"
        hosts => "127.0.0.1:9200"
        index  => "logstash-%{+YYYY-MM}"
    }
    stdout { codec=> rubydebug }
}

爲了測試方便,同時開啓控制檯輸入和輸出。

[elk@elk1 config]$ vim jvm.options   #設置最多使用256m內存

-Xms256m
-Xmx256m

啓動logstash。

隨便輸入個字符串測試下,如上,看下http://192.168.230.128:9100/

這樣logstash對於寫入es和從控制檯輸入的配置就正確了,filebeat還須要等咱們後面驗證。咱們先完成Kibana的安裝與配置。

Kibana安裝

kibana也是個nodejs應用。首先來修改kibana的配置:

[elk@elk1 app]$ cd kibana-6.2.4-linux-x86_64/config/
[elk@elk1 config]$ ll
總用量 8
-rw-r--r--. 1 zhjh256 zhjh256 4647 6月 2 12:32 kibana.yml
[elk@elk1 config]$ vim kibana.yml  # 確保下列配置正確

server.port: 5601

server.host: "192.168.230.128"

elasticsearch.url: "http://localhost:9200"

上述配置完成後,就能夠啓動了。

 

訪問下http://192.168.230.128:5601。

第一次訪問的時候,會要求設置Index Pattern,由於咱們在logstash-es.conf中設置爲logstash-%{+YYYY-MM},因此設置爲logstash-*就能夠了。

Discover是主要的查詢交互界面,以下所示:

 

搜索下,咱們剛纔在控制檯輸入的測試文字:

 

有時候在訪問discover的時候,提示no results found,以下所示:

 這一般是因爲默認的查詢時間範圍過短的緣由,能夠經過右上角的TimeRange來設置查詢的時間範圍。

到這裏,ELK的環境搭建與基本配置就完成了。

更多的配置與優化參見各官方文檔https://www.elastic.co/guide/index.html。後續有時間的話,筆者會再寫一篇。

Filebeat安裝與配置

採用Filebeat做爲源端代理以後,準確的說,跟log4j已經沒有關係了。因此這裏假設讀者知道log4j的配置,生成的文件在d:\httx\logs目錄。

由於windows下Filebeat的啓動腳本是使用powershell腳本編寫的,因此確保安裝了ps,windows 10下自帶。

從https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-windows-x86_64.zip下載windows版本的filebeat。filebeat能夠安裝在任何目錄,這裏以D:\chrome下載\filebeat爲例。

打開配置文件D:\chrome下載\filebeat\filebeat.yml,確保下列設置正確:

filebeat.prospectors:
- type: log
  enabled: true  #啓用配置
  paths:
    - D:\httx\logs\*  #設置監控路徑
#output.elasticsearch:   #禁用ES寫入
output.logstash:            #啓用logstash寫入
  # The Logstash hosts
  hosts: ["192.168.230.128:5000"]

安裝與啓動filebeat。

打開powershell,執行以下命令:

PS C:\Users\admin> cd 'D:\chrome下載\filebeat'
PS D:\chrome下載\filebeat> .\install-service-filebeat.ps1

安全警告
請只運行你信任的腳本。雖然來自 Internet 的腳本會有必定的用處,但此腳本可能會損壞你的計算機。若是你信任此腳本,請使用
Unblock-File cmdlet 容許運行該腳本,而不顯示此警告消息。是否要運行 D:\chrome下載\filebeat\install-service-filebeat.ps1?
[D] 不運行(D)  [R] 運行一次(R)  [S] 暫停(S)  [?] 幫助 (默認值爲「D」): R

Status   Name               DisplayName
------   ----               -----------
Stopped  filebeat           filebeat


PS D:\chrome下載\filebeat> Start-Service filebeat
PS D:\chrome下載\filebeat> Stop-Service filebeat

filebeat的日誌在C:\ProgramData\filebeat\logs目錄下,這是寫死的,不知道哪裏能夠更改。

filebeat會按期輸出日誌以及遇到的異常信息。

最後,咱們再回到kibana控制檯,看下log4j相關的日誌,以下:

左邊控制要顯示哪些列,好比顯示來源和主機:

 

 到此爲止,整個ELK+log4j的集成自己就完成了。可是要達到高效可用的步驟,下列問題還須要進一步研究:

一、filebeat讀取文件彷佛是以行爲單位,這在exception堆棧下是不可接受的,須要logstash或者其餘方式二次處理。

二、es head的控制檯應該來講做爲es的監控還能夠,可是做爲日誌交互基本上沒什麼用,效果太差了。kibana還不錯,只不過filter不是起碼應該固定麼??

三、elk的詳細配置以及優化。

四、filebeat日誌中出現"sync.go:105: ERR Failed to publish events (host: 10.172.0.165:5044:10200), caused by: write tcp ",可是不影響日誌的發送。

參見ELK最新版6.2.4學習筆記-Logstash和Filebeat解析。對於log4j以及log4j2日誌解析爲每一個字段,後續將補充「使用grok將log4j/log4j2日誌解析爲ES字段」。

 

參考:

https://serverfault.com/questions/911440/filebeat-cant-connect-to-logstash-on-another-server

https://elasticsearch.cn/question/3157

其餘:

[ERROR][logstash.plugins.registry] Tried to load a plugin's code, but failed. {:exception=>#<LoadError: no such file to load -- logstash/inputs/log4j>, :path=>"logstash/inputs/log4j", :type=>"input", :name=>"log4j"}
解決方法:運行bin/logstash-plugin install logstash-input-log4j 安裝log4j插件,默認狀況下,插件沒有綁定,參考https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html
log4j:ERROR Could not connect to remote log4j server at [192.168.230.128]. We will try again later
解決方法:logstash的log4j監聽地址由127.0.0.1改爲ip好比192.168.230.128

log4j:WARN Detected problem with connection: java.net.SocketException: Connection reset by peer: socket write error採用低版本的ELK好比2.x版本,ELK 2.x以後的版本就是5.x、6.x,3.x、4.x是跳版了的。

相關文章
相關標籤/搜索