ELK學習筆記之CentOS 7下ELK(6.2.4)++LogStash+Filebeat+Log4j日志集成環境搭建


 

0x00 簡介

現在的公司由於絕大部分項目都采用分布式架構,很早就采用ELK了,只不過最近因為額外的工作需要,仔細的研究了分布式系統中,怎么樣的日志規范和架構才是合理和能夠有效提高問題排查效率的。

經過仔細的分析和研究,確定下面的架構應該是比較合理的之一(Filebeat也支持直接寫到ES),如果可以的話,Filebeat也可以不直接連到Logstash,先寫到kafka,然后從kafka寫到logstash的kafka插件。

關於ELK的各種架構以及優缺點,可以參考

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

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

其次,對於分布式請求,還要解決全局的請求日志上下文關聯的問題,這需要依賴與具體的RPC框架來實現,以dubbo為例,可以通過filter在請求端和服務端設置。

第三,服務的調用鏈應該可以算做是日志框架的范疇,這可以通過zipkin集成來實現。

 

在實現上,對於服務的調用鏈可以使用單獨的ES存儲、也可以在一個大的ES集群中存儲為一個index。

從ELK 6.0開始,對於源是log4j的場景,不再建議使用logstash-input-log4j,而是使用Filebeat作為應用端的日志代理,具體可以參考

所以,在本文的搭建過程中,筆者采用的也是Filebeat的方案。

 

0x01 環境說明與准備

Filebeat一般安裝在產生日志的服務器,這里tomcat在windows 10 x64下,所以Filebeat也需要安裝在windows下。

# CentOS 7.4 64位 ip 192.168.26.135 
# 防火牆關閉 Selinux關閉

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

# Elasticsearch 6.2.4

# Kibana 6.2.4

# Logstash 6.2.4

# elasticsearch-head(從github直接clone)

# filebeat 6.2.4

# phantomjs-2.1.1-linux-x84_64 (配合npm指令使用)

# node-v4.9.1-linux-x64 (記住文件夾路徑,需要增加到bash_profile中)

官網下載並解壓。

 

因為ES主要通過restful api對外提供服務,所以一般安裝ES時順帶安裝elasticsearch-head,它提供了web控制台。

 

elasticsearch-head通過源碼的方式托管在git上,所以需要安裝下git,直接yum安裝即可。

# yum install git

 

同時elasticsearch-head是一個nodejs應用,所以還需要具有node, 需要安裝phantomjs。(安裝教程可以參考這篇博客)

 

所以在正式開始前,我們需要確保centos下下列基礎設施已經具備:

1、git已經安裝。

# yum install git

 

2、如果希望源碼安裝nodejs,確保gcc滿足node的要求,或者直接使用已經編譯好的版本。

筆者直接使用編譯好的版本,可從https://nodejs.org/en/download/releases/選擇具體的版本,基礎運行環境最好不要使用最新版本,這里我們使用v4.9。下載解壓后即可用。

注意安裝版本和下載解壓后的文件路徑,下面要加到.bash_profile中。

 

3、因為elk不能使用root運行,所以需要新建一個elk用戶並設置環境變量。

# groupadd elk

# useradd -g elk elk

設置elk用戶的環境變量:

# su - elk

vim .bash_profile  增加如下:注意node-v4.9.1的文件夾路徑

# 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

 

4、下載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/mobz/elasticsearch-head

 

 

0x02 安裝ElasticSearch

因為使用的是vmware,總共內存才分配了1G,所以為了避免OOM,對ES以及logstash內存均進行了調整,限制為256M

 

因為es需要非root用戶運行,所以對於ES相關的所有操作均在elk用戶下運行。

# su - elk

 

更改ES配置:

 

# 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了。

 

 

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

 ElasticSearch安裝完成。

 

0x03 啟動ElasticSearch的TroubleShooting

 報錯細節,請參考這篇博客

 

0x04 安裝ElasticSearch-head

需要注意的是,雖然ES head可以認為是es的插件,但是它不能放在$ES_HOME/plugins目錄下,因為它並不符合ES插件的規范,否則ES啟動會失敗。

[elk@localhost elasticsearch-head]$ pwd
/usr/local/app/elasticsearch-head
[elk@localhost 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了,如下:

 

 

 windows下瀏覽器訪問下http://192.168.26.135:9100

 

 0x04 安裝Logstash

logstash和kibana可以使用root用戶來啟動。

Logstach需要搭配指定的配置文件啟動創建一個logstash配置文件,比如logstash-es.conf,配置從filebeat讀取數據源,輸出到es。

為了簡化起見,忽略過濾器(實際生產中,一般需要配置過濾器對日志進行規范化處理和分類)

# 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 }
}

 

 配置jvm文件

# vim jvm.options   #設置最多使用256m內存

 

 啟動logstash

# ./bin/logstash -f ./config/logstash-es.conf

 

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

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

 

0x05 Kibana安裝

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

#  cd kibana-6.2.4-linux-x86_64/config/

 

更改配置文件

# vim kibana.yml  # 確保下列配置正確
server.port: 5601

server.host: "192.168.26.135"

elasticsearch.url: "http://localhost:9200"  # 此處localhost=192.168.26.135,需要寫ES Server的IP

 

上述配置完成后,就可以啟動了

 

訪問下http://192.168.26.135:5601

 

第一次訪問的時候,會要求設置Index Pattern,因為我們在logstash-es.conf中設置為logstash-%{+YYYY-MM},所以設置為logstash-*就可以了。

# 這里有可能會遇到要求你創建Index的情況,請參考官網的指導文件和該博客導入json文件即可
# 官網指導文件 https://www.elastic.co/guide/en/kibana/6.x/tutorial-load-dataset.html
# 如何批量導入數據到Kibana,https://www.cnblogs.com/hai-ping/p/6068946.html

 

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

 

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

 

這通常是由於默認的查詢時間范圍太短的原因,可以通過右上角的TimeRange來設置查詢的時間范圍。

 

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

更多的配置與優化參見各官方文檔

 

0x06 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:\filebeat為例。

打開配置文件D:\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.26.135:5000"]

安裝與啟動filebeat。

打開powershell,執行如下命令:

PS C:\Users\admin> cd 'D:\filebeat'
PS D:\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:\filebeat> Start-Service filebeat
PS D:\filebeat> Stop-Service filebeat

filebeat的日志在C:\ProgramData\filebeat\logs目錄下,這是寫死的,不知道哪里可以更改。

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

最后,我們再回到kibana控制台,看下log4j相關的日志,如下:

 

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

 

 

到此為止,整個ELK+log4j的集成本身就完成了。但是要達到高效可用的步驟,下列問題還需要進一步研究:

1、filebeat讀取文件似乎是以行為單位,這在exception堆棧下是不可接受的,需要logstash或者其他方式二次處理。

2、es head的控制台應該來說作為es的監控還可以,但是作為日志交互基本上沒什么用,效果太差了。kibana還不錯,只不過filter不是起碼應該固定么??

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

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

 

參考:

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是跳版了的。

 

 參考

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM