ELK+kafka收集 Nginx與tomcat日誌

ELK日誌收集

ELK原理與介紹
爲什麼用到ELK:
一般我們需要進行日誌分析場景:直接在日誌文件中 grep、awk 就可以獲得自己想要的信息。但在規模較大的場景中,此方法效率低下,面臨問題包括日誌量太大如何歸檔、文本搜索太慢怎麼辦、如何多維度查詢。需要集中化的日誌管理,所有服務器上的日誌收集彙總。常見解決思路是建立集中式日誌收集系統,將所有節點上的日誌統一收集,管理,訪問。
一般大型系統是一個分佈式部署的架構,不同的服務模塊部署在不同的服務器上,問題出現時,大部分情況需要根據問題暴露的關鍵信息,定位到具體的服務器和服務模塊,構建一套集中式日誌系統,可以提高定位問題的效率。
一個完整的集中式日誌系統,需要包含以下幾個主要特點:
1.收集-能夠採集多種來源的日誌數據
2.傳輸-能夠穩定的把日誌數據傳輸到中央系統
3.存儲-如何存儲日誌數據
4.分析-可以支持 UI 分析
5.警告-能夠提供錯誤報告,監控機制
ELK提供了一整套解決方案,並且都是開源軟件,之間互相配合使用,完美銜接,高效的滿足了很多場合的應用。目前主流的一種日誌系統。
ELK簡介:
ELK是三個開源軟件的縮寫,分別表示:Elasticsearch , Logstash, Kibana , 它們都是開源軟件。新增了一個FileBeat,它是一個輕量級的日誌收集處理工具(Agent),Filebeat佔用資源少,適合於在各個服務器上搜集日誌後傳輸給Logstash,官方也推薦此工具。
Elasticsearch是個開源分佈式搜索引擎,提供蒐集、分析、存儲數據三大功能。它的特點有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
Logstash 主要是用來日誌的蒐集、分析、過濾日誌的工具,支持大量的數據獲取方式。一般工作方式爲c/s架構,client端安裝在需要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操作在一併發往elasticsearch上去。
Kibana 也是一個開源和免費的工具,Kibana可以爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,可以幫助彙總、分析和搜索重要數據日誌。
Filebeat隸屬於Beats。目前Beats包含四種工具:
1.Packetbeat(蒐集網絡流量數據)
2.Topbeat(蒐集系統、進程和文件系統級別的 CPU 和內存使用情況等數據)
3.Filebeat(蒐集文件數據)
4.Winlogbeat(蒐集 Windows 事件日誌數據)
官方文檔:
Filebeat:
https://www.elastic.co/cn/products/beats/filebeat
https://www.elastic.co/guide/en/beats/filebeat/5.6/index.html
Logstash:
https://www.elastic.co/cn/products/logstash
https://www.elastic.co/guide/en/logstash/5.6/index.html
Kibana:
https://www.elastic.co/cn/products/kibana
https://www.elastic.co/guide/en/kibana/5.5/index.html
Elasticsearch:
https://www.elastic.co/cn/products/elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html
elasticsearch中文社區:
https://elasticsearch.cn/
ELK架構圖
架構圖一:

這是最簡單的一種ELK架構方式。優點是搭建簡單,易於上手。缺點是Logstash耗資源較大,運行佔用CPU和內存高。另外沒有消息隊列緩存,存在數據丟失隱患。
此架構由Logstash分佈於各個節點上搜集相關日誌、數據,並經過分析、過濾後發送給遠端服務器上的Elasticsearch進行存儲。Elasticsearch將數據以分片的形式壓縮存儲並提供多種API供用戶查詢,操作。用戶亦可以更直觀的通過配置Kibana Web方便的對日誌查詢,並根據數據生成報表。
架構圖二:

此種架構引入了消息隊列機制,位於各個節點上的Logstash Agent先將數據/日誌傳遞給Kafka(或者Redis),並將隊列中消息或數據間接傳遞給Logstash,Logstash過濾、分析後將數據傳遞給Elasticsearch存儲。最後由Kibana將日誌和數據呈現給用戶。因爲引入了Kafka(或者Redis),所以即使遠端Logstash server因故障停止運行,數據將會先被存儲下來,從而避免數據丟失。
架構圖三:

此種架構將收集端logstash替換爲beats,更靈活,消耗資源更少,擴展性更強。同時可配置Logstash 和Elasticsearch 集羣用於支持大集羣系統的運維日誌數據監控和查詢
Filebeat工作原理:
Filebeat由兩個主要組件組成:prospectors 和 harvesters。這兩個組件協同工作將文件變動發送到指定的輸出中。

Harvester(收割機):負責讀取單個文件內容。每個文件會啓動一個Harvester,每個Harvester會逐行讀取各個文件,並將文件內容發送到制定輸出中。Harvester負責打開和關閉文件,意味在Harvester運行的時候,文件描述符處於打開狀態,如果文件在收集中被重命名或者被刪除,Filebeat會繼續讀取此文件。所以在Harvester關閉之前,磁盤不會被釋放。默認情況filebeat會保持文件打開的狀態,直到達到close_inactive(如果此選項開啓,filebeat會在指定時間內將不再更新的文件句柄關閉,時間從harvester讀取最後一行的時間開始計時。若文件句柄被關閉後,文件發生變化,則會啓動一個新的harvester。關閉文件句柄的時間不取決於文件的修改時間,若此參數配置不當,則可能發生日誌不實時的情況,由scan_frequency參數決定,默認10s。Harvester使用內部時間戳來記錄文件最後被收集的時間。例如:設置5m,則在Harvester讀取文件的最後一行之後,開始倒計時5分鐘,若5分鐘內文件無變化,則關閉文件句柄。默認5m)。
Prospector(勘測者):負責管理Harvester並找到所有讀取源。Prospector會找到/apps/logs/*目錄下的所有info.log文件,併爲每個文件啓動一個Harvester。Prospector會檢查每個文件,看Harvester是否已經啓動,是否需要啓動,或者文件是否可以忽略。若Harvester關閉,只有在文件大小發生變化的時候Prospector纔會執行檢查。只能檢測本地的文件。
Filebeat如何記錄文件狀態:
將文件狀態記錄在文件中(默認在/var/lib/filebeat/registry)。此狀態可以記住Harvester收集文件的偏移量。若連接不上輸出設備,如ES等,filebeat會記錄發送前的最後一行,並再可以連接的時候繼續發送。Filebeat在運行的時候,Prospector狀態會被記錄在內存中。Filebeat重啓的時候,利用registry記錄的狀態來進行重建,用來還原到重啓之前的狀態。每個Prospector會爲每個找到的文件記錄一個狀態,對於每個文件,Filebeat存儲唯一標識符以檢測文件是否先前被收集。
Filebeat如何保證事件至少被輸出一次:
Filebeat之所以能保證事件至少被傳遞到配置的輸出一次,沒有數據丟失,是因爲filebeat將每個事件的傳遞狀態保存在文件中。在未得到輸出方確認時,filebeat會嘗試一直髮送,直到得到迴應。若filebeat在傳輸過程中被關閉,則不會再關閉之前確認所有時事件。任何在filebeat關閉之前爲確認的時間,都會在filebeat重啓之後重新發送。這可確保至少發送一次,但有可能會重複。可通過設置shutdown_timeout 參數來設置關閉之前的等待事件迴應的時間(默認禁用)。

Logstash工作原理:
Logstash事件處理有三個階段:inputs → filters → outputs。是一個接收,處理,轉發日誌的工具。支持系統日誌,webserver日誌,錯誤日誌,應用日誌,總之包括所有可以拋出來的日誌類型。

Input:輸入數據到logstash。
一些常用的輸入爲:
file:從文件系統的文件中讀取,類似於tial -f命令
syslog:在514端口上監聽系統日誌消息,並根據RFC3164標準進行解析
redis:從redis service中讀取
beats:從filebeat中讀取
Filters:數據中間處理,對數據進行操作。
一些常用的過濾器爲:
grok:解析任意文本數據,Grok 是 Logstash 最重要的插件。它的主要作用就是將文本格式的字符串,轉換成爲具體的結構化的數據,配合正則表達式使用。內置120多個解析語法。
官方提供的grok表達式:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
grok在線調試:https://grokdebug.herokuapp.com/
mutate:對字段進行轉換。例如對字段進行刪除、替換、修改、重命名等。
drop:丟棄一部分events不進行處理。
clone:拷貝 event,這個過程中也可以添加或移除字段。
geoip:添加地理信息(爲前臺kibana圖形化展示使用)
Outputs:outputs是logstash處理管道的最末端組件。一個event可以在處理過程中經過多重輸出,但是一旦所有的outputs都執行結束,這個event也就完成生命週期。
一些常見的outputs爲:
elasticsearch:可以高效的保存數據,並且能夠方便和簡單的進行查詢。
file:將event數據保存到文件中。
graphite:將event數據發送到圖形化組件中,一個很流行的開源存儲圖形化展示的組件。
Codecs:codecs 是基於數據流的過濾器,它可以作爲input,output的一部分配置。Codecs可以幫助你輕鬆的分割發送過來已經被序列化的數據。
一些常見的codecs:
json:使用json格式對數據進行編碼/解碼。
multiline:將匯多個事件中數據彙總爲一個單一的行。比如:java異常信息和堆棧信息。

部署ELK:
1.搭建客戶機Nginx
ls[root@nginx ~]# hostname
nginx
[root@nginx ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@nginx ~]# uname -r
2.6.32-431.el6.x86_64
[root@nginx ~]# /etc/init.d/iptables stop
iptables:將鏈設置爲政策 ACCEPT:filter [確定]
iptables:清除防火牆規則: [確定]
iptables:正在卸載模塊: [確定]
[root@nginx ~]# setenforce 0
setenforce: SELinux is disabled
[root@nginx ~]# chkconfig iptables off
[root@nginx ~]# tar xf nginx-1.13.12.tar.gz -C /usr/src/
[root@nginx ~]# useradd -M -s /sbin/nologin nginx
[root@nginx ~]# cd /usr/src/nginx-1.13.12/
[root@nginx nginx-1.13.12]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
[root@nginx nginx-1.13.12]# cp -p /usr/local/nginx/sbin/ /usr/local/sbin/
[root@nginx nginx-1.13.12]# nginx
[root@nginx nginx-1.13.12]# netstat -anpt|grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:
LISTEN 5605/nginx
3.部署Elasticserch(Logstash、Kibana三臺都需要安裝JDK)
1.查看系統環境:
[root@Elasticserch ~]# hostname
Elasticserch
[root@Elasticserch ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@Elasticserch ~]# uname -r
2.6.32-431.el6.x86_64
[root@Elasticserch ~]# /etc/init.d/iptables stop
[root@Elasticserch ~]# setenforce 0
2.安裝JDK環境:
[root@Elasticserch ~]# tar xf jdk-8u161-linux-x64.tar.gz
[root@Elasticserch ~]# mv jdk1.8.0_161/ /usr/local/java
[root@Elasticserch ~]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
[root@Elasticserch ~]# source /etc/profile
[root@Elasticserch ~]# java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
3.安裝Elasticserch節點:
[root@Elasticserch ~]# tar xf elasticsearch-6.2.4.tar.gz
[root@Elasticserch ~]# mv elasticsearch-6.2.4 /usr/local/elasticsearch
[root@Elasticserch ~]# cd /usr/local/elasticsearch/
[root@Elasticserch elasticsearch]# cd config/
[root@Elasticserch config]# cp elasticsearch.yml{,.default} #備份配置文件,防止修改錯誤
4.修改配置文件:
[root@Elasticserch config]# vim elasticsearch.yml
cluster.name: my-es-cluster #集羣的名稱
node.name: node-1 #節點的名稱
path.data: /usr/local/elasticsearch/data #數據路徑
path.logs: /usr/local/ elasticsearch /logs #日誌路徑
bootstrap.memory_lock: false #這行去掉註釋把ture改成false,不改會造成服務啓動報錯
bootstrap.system_call_filter: false #添加這行,否則啓動會報錯。
配置上述兩行的原因:
這是在因爲Centos6不支持SecComp,而ES5.2.0默認bootstrap.system_call_filter爲true進行檢測,所以導致檢測失敗,失敗後直接導致ES不能啓動。
network.host: 192.168.200.132 # elasticsearch主機地址
http.port: 9200 #端口號
discovery.zen.ping.unicast.hosts: ["node-1"] #啓動新節點通過主機列表發現。
discovery.zen.minimum_master_nodes: 1 #總節點數
[root@elasticsearch ~]# vim /etc/security/limits.d/90-nproc.conf

  • soft nproc 4096 #默認1024,改成4096
    [root@elasticsearch ~]# vim /etc/sysctl.conf
    #末尾追加否則服務會報錯。
    vm.max_map_count=655360
    [root@elasticsearch ~]# sysctl -p #使上述配置生效
    3.創建elasticsearch運行的用戶:
    [root@Elasticserch config]# useradd elasticsearch
    [root@Elasticserch config]# chown -R elasticsearch.elasticsearch /usr/local/elasticsearch/
    4.修改文件句柄數:
    [root@Elasticserch config]# vim /etc/security/limits.conf
    #添加下面內容:
  • soft nofile 65536
  • hard nofile 65536
  • soft nproc 65536
  • hard nproc 65536
    5.切換用戶啓動服務
    [root@Elasticserch config]# su - elasticsearch -c '/usr/local/elasticsearch/bin/elasticsearch'
    echo "su - elasticsearch -c '/usr/local/elasticsearch/bin/elasticsearch'" >> /etc/rc.local注:如果啓動錯誤請看下上述配置過程×××標記的部分是否有配置錯誤或者沒有配置。

6.查看服務是否啓動成功
[root@elasticsearch ~]# netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0: LISTEN 970/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:
LISTEN 1150/sshd
tcp 0 0 0.0.0.0:56600 0.0.0.0: LISTEN 988/rpc.statd
tcp 0 0 127.0.0.1:25 0.0.0.0:
LISTEN 1226/master
tcp 0 64 192.168.200.132:22 192.168.200.2:62459 ESTABLISHED 1301/sshd
tcp 0 0 :::111 ::: LISTEN 970/rpcbind
tcp 0 0 ::ffff:192.168.200.132:9200 :::
LISTEN 3990/java
tcp 0 0 ::ffff:192.168.200.132:9300 ::: LISTEN 3990/java
tcp 0 0 :::52916 :::
LISTEN 988/rpc.statd
tcp 0 0 :::22 ::: LISTEN 1150/sshd
tcp 0 0 ::1:25 :::
LISTEN 1226/master
7.簡單測試下:
[root@elasticsearch ~]# curl http://192.168.200.132:9200
{
"name" : "node-1",
"cluster_name" : "my-es-cluster",
"cluster_uuid" : "tMW5tRXMTwO0g1i9BAp0rg",
"version" : {
"number" : "6.2.4",
"build_hash" : "ccec39f",
"build_date" : "2018-04-12T20:37:28.497551Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
說明服務正常。
8.安裝head插件:
[root@Elasticserch ~]# vim /usr/local/elasticsearch/config/elasticsearch.yml

增加參數,使head插件可以訪問es

http.cors.enabled: true
http.cors.allow-origin: ""
下載head插件
wget https://github.com/mobz/elasticsearch-head/archive/master.zip
安裝node
wget https://npm.taobao.org/mirrors/node/latest-v4.x/node-v4.4.7-linux-x64.tar.gz
tar -zxvf node-v4.4.7-linux-x64.tar.gz
配置下環境變量,編輯/etc/profile添加
[root@Elasticserch ~]# vim /etc/profile.d/node.sh
export NODE_HOME=/root/node-v4.4.7-linux-x64
export PATH=$PATH:$NODE_HOME/bin
export DODE_PATH=$NODE_HOME/lib/node_modules
[root@Elasticserch ~]# . /etc/profile
安裝grunt
grunt是基於Node.js的項目構建工具,可以進行打包壓縮、測試、執行等等的工作,head插件就是通過grunt啓動
[root@Elasticserch ~]# unzip master.zip
[root@Elasticserch ~]# cd elasticsearch-head-master/
[root@Elasticserch elasticsearch-head-master]# npm install -g grunt-cli # 執行後會生成node_modules文件夾
[root@Elasticserch elasticsearch-head-master]# grunt -version
grunt-cli v1.2.0
[root@Elasticserch elasticsearch-head-master]# vim Gruntfile.js
connect: {
server: {
options: {
port: 9100,
base: '.',
keepalive: true
hostname: '
' #添加這行
[root@Elasticserch elasticsearch-head-master]# vim _site/app.js
(function( app, i18n ) {

    var ui = app.ns("ui");
    var services = app.ns("services");

    app.App = ui.AbstractWidget.extend({
            defaults: {
                    base_uri: null
            },
            init: function(parent) {
                    this._super();
                    this.prefs = services.Preferences.instance();
                    this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://192.168.200.130:9200";            #改成es地址

運行head
[root@Elasticserch elasticsearch-head-master]# grunt server &

重啓es
報錯解決方法:
npm config set strict-ssl false
npm config set registry http://registry.cnpmjs.org
npm info underscore
npm --registry http://registry.cnpmjs.org info underscore
編輯 ~/.npmrc 加入下面內容
registry = http://registry.cnpmjs.org
4.部署Logstash節點
1.查看系統環境:
[root@Logstash ~]# hostname
Logstash
[root@Logstash ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@Logstash ~]# uname -r
2.6.32-431.el6.x86_64
[root@Logstash ~]# /etc/init.d/iptables stop
iptables:將鏈設置爲政策 ACCEPT:filter [確定]
iptables:清除防火牆規則: [確定]
iptables:正在卸載模塊: [確定]
[root@Logstash ~]# setenforce 0
setenforce: SELinux is disabled
2.安裝logstash,通過它來監聽數據源文件的新增內容經過logstash處理後上傳到es裏面。
[root@Logstash ~]# tar xf logstash-6.2.4.tar.gz
[root@Logstash ~]# mv logstash-6.2.4 /usr/local/logstash

Logstash默認有input、filter、output三個區域,一般最少需要配置input和output即可!
logstash的本身默認的logstash.yml配置文件選擇不修改即可!
7.測試下logstash,指定配置文件啓動:
5.部署Kibana節點
1.查看系統環境:
[root@Kibana ~]# hostname
Kibana
[root@Kibana ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@Kibana ~]# uname -r
2.6.32-431.el6.x86_64
2.安裝kibana
[root@Kibana ~]# tar xf kibana-6.2.4-linux-x86_64.tar.gz
[root@Kibana ~]# mv kibana-6.2.4-linux-x86_64 /usr/local/kibana
[root@Kibana ~]# cd /usr/local/kibana/config/
[root@Kibana config]# cp kibana.yml{,.default}
3.編輯配置文件:
[root@Kibana config]# vim kibana.yml
server.port: 5601 #這行去掉註釋
server.host: "192.168.200.134" #去掉註釋,寫上本機地址
elasticsearch.url: "http://192.168.200.132:9200" #寫上elasticsearch主機的IP
4.啓動服務:
[root@Kibana config]# nohup /usr/local/kibana/bin/kibana &
log [19:28:15.757] [info][status][plugin:[email protected]] Status changed from uninitialized to green - Ready
log [19:28:15.871] [info][status][plugin:[email protected]] Status changed from uninitialized to yellow - Waiting for Elasticsearch
log [19:28:16.190] [info][status][plugin:[email protected]] Status changed from uninitialized to green - Ready
log [19:28:16.209] [info][status][plugin:[email protected]] Status changed from uninitialized to green - Ready
log [19:28:16.225] [info][status][plugin:[email protected]] Status changed from uninitialized to green - Ready
log [19:28:16.299] [info][listening] Server running at http://192.168.200.134:5601
log [19:28:16.448] [info][status][plugin:[email protected]] Status changed from yellow to green - Ready
[root@Kibana ~]# netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0: LISTEN 1123/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:
LISTEN 1199/master
tcp 0 0 192.168.200.134:5601 0.0.0.0: LISTEN 1355/../bin/../node
tcp 0 0 192.168.200.134:22 192.168.200.2:65383 ESTABLISHED 1273/sshd
tcp 0 0 192.168.200.134:39393 192.168.200.132:9200 ESTABLISHED 1355/../bin/../node
tcp 0 0 :::22 :::
LISTEN 1123/sshd
tcp 0 0 ::1:25 :::* LISTEN 1199/master
5.打開瀏覽器訪問192.168.200.134:5601

6.Nginx安裝filebeat收集日誌:
1.安裝filebeat:
[root@nginx ~]# vim /usr/local/filebeat/filebeat.yml
[root@nginx ~]# tar xf filebeat-6.2.4-linux-x86_64.tar.gz
[root@nginx ~]# mv filebeat-6.2.4-linux-x8664 /usr/local/filebeat
[root@nginx ~]# cp /usr/local/filebeat/filebeat.yml{,.default}
2.因爲logstash默認沒有Nginx日誌格式需要手動創建添加:
[root@Logstash ~]# vim /usr/local/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/nginx
#將下面內容添加到文件裏即可,下面內容是日誌格式,和格式內容:
URIPARM1 [A-Za-z0-9$.+!*'|(){},~@#%&/=:;
?-[]]
URIPATH1 (?:/[A-Za-z0-9$.+!
'(){},~:;=@#%&_- ])+
URI1 (%{URIPROTO}://)?(?:%{USER}(?::[^@]
)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})?
NGINXACCESS %{IPORHOST:remote_addr} - (%{USERNAME:user}|-) [%{HTTPDATE:log_timestamp}] %{HOSTNAME:http_host} %{WORD:request_method} \"%{URIPATH1:uri}\" \"%{URIPARM1:param}\" %{BASE10NUM:http_status} (?:%{BASE10NUM:body_bytes_sent}|-) \"(?:%{URI1:http_referrer}|-)\" (%{BASE10NUM:upstream_status}|-) (?:%{HOSTPORT:upstream_addr}|-) (%{BASE16FLOAT:upstream_response_time}|-) (%{BASE16FLOAT:request_time}|-) (?:%{QUOTEDSTRING:user_agent}|-) \"(%{IPV4:client_ip}|-)\" \"(%{WORD:x_forword_for}|-)\"
注:日誌默認路徑/usr/local/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/
收集Nginx-access,Nginx-error日誌
1.配置Logstash
[root@Logstash logstash]# vim /usr/local/logstash/config/nginx_log.conf
input {
beats {
port => "5044"
}
}
filter {
if [type] == "nginx"{
grok {
match => { "message" => "%{NGINXACCESS}" }

}

}

date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => ["datetime"]
}
geoip {
source => "clientip"
}

}
output {
if [fields][logsource] == "nginx_access"{
elasticsearch {
hosts => ["192.168.200.130:9200"]
index => "nginx_access"
}
}
if [fields][logsource] == "nginx_error"{
elasticsearch {
hosts => ["192.168.200.130:9200"]
index => "nginx_error"
}
}

stdout { codec => rubydebug }
}

2.配置filebeat:
[root@mobanji filebeat]# egrep -v "#|^$" filebeat.yml
filebeat.prospectors:

  • type: log
    fields:
    logsource: nginx_access
    log_type: access_log
    paths:
    • /usr/local/nginx/logs/access.log
  • type: log
    fields:
    logsource: nginx_error
    log_type: error_log
    paths:
    • /usr/local/nginx/logs/error.log
      output.logstash:
      hosts: ["192.168.200.131:5044"]
      結束原有的filebeat進程
      ps -elf | grep filebeat
      kill -9 pid
      啓動filebeat
      nohup /usr/local/filebeat/filebeat &

Redis做消息隊列
1.連接從Redis中獲取日誌文件並存儲到ES中
[root@Logstash ~]# vim /usr/local/logstash/config/redis.conf
input {
beats {
port => "5044"
}
redis {
data_type => "list"
key => "220"
host => "192.168.200.134"
port => 6379
db => 0
threads => 1
}
}
filter {
if [type] == "nginx"{
grok {
match => { "message" => "%{NGINXACCESS}" }

}

}

date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => ["datetime"]
}
geoip {
source => "clientip"
}

}

output {
if [fields][logsource] == "220nginx_access"{
elasticsearch {
hosts => ["192.168.200.130:9200"]
index => "220nginx_access"
}
}
if [fields][logsource] == "220nginx_error"{
elasticsearch {
hosts => ["192.168.200.130:9200"]
index => "220nginx_error"
}
}

    stdout { codec => rubydebug }

}

2.將Nginx訪問日誌和錯誤日誌推送到Redis消息隊列中。
[root@mobanji filebeat]# egrep -v "#|^$" filebeat.yml
filebeat.prospectors:

  • type: log
    fields:
    logsource: 220nginx_access
    log_type: access_log
    fields_under_root: true
    paths:
    • /usr/local/nginx/logs/access.log
  • type: log
    fields:
    logsource: 220nginx_error
    log_type: error_log
    paths:
    • /usr/local/nginx/logs/error.log
      output.redis:
      hosts: ["192.168.200.134"]
      port: 6379
      db: 0
      timeout: 5
      key: "220"

使用Kafka做消息隊列
Kafka單節點部署

注:需要先部署java
[root@Elasticserch ~]# tar xf jdk-8u161-linux-x64.tar.gz
[root@Elasticserch ~]# mv jdk1.8.0_161/ /usr/local/java
[root@Elasticserch ~]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
[root@Elasticserch ~]# source /etc/profile
[root@Elasticserch ~]# java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

1, 安裝zookeeper
tar xf zookeeper-3.4.10.tar.gz
mv zookeeper-3.4.10 /usr/local/
cd /usr/local/zookeeper-3.4.10/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/data
dataLogDir=/var/zookeeper/logs
clientPort=2181

../bin/zkServer.sh start
tar xf kafka_2.11-2.0.0.tgz
mv kafka_2.11-2.0.0 /usr/local/kafka
cd /usr/local/kafka/config/
vim /usr/local/kafka/config/server.properties

broker.id=1 設置節點的ID號,不能相同
listeners=PLAINTEXT://192.168.56.35:9092 設置監聽的地址
log.dirs=/var/kafka/kafka-logs 指定日誌目錄
zookeeper.connect=192.168.56.35:2181 配置連接zookeeper

已守護進程的方式啓動kafka
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties

修改Nginx端的filebeat配置文件
vim filebeat.yml
filebeat.prospectors:

  • type: log
    fields:
    logsource: nginx_access
    log_type: access_log
    paths:
    • /usr/local/nginx/logs/access.log
  • type: log
    fields:
    logsource: nginx_error
    log_type: error_log
    paths:
    • /usr/local/nginx/logs/error.log
      output.kafka:
      enabled: true
      hosts: ["192.168.56.35:9092"]
      topic: "nginx-filebeat"
      partition.hash:
      reachable_only: true
      compression: gzip
      max_message_bytes: 1000000
      required_acks: 1
      logging.to_files: true

修改完成後重新啓動filebeat服務。

新建log節點的配置文件,將之前的測試配置文件刪除。
vim /usr/local/logstash/config/kafka_log.conf
input{
kafka{
bootstrap_servers => "192.168.56.35:9092"
topics => "nginx-filebeat"
consumer_threads => 1
decorate_events => true
codec => "json"
auto_offset_reset => "latest"

}

}

filter {

if [type] == "nginx"{
grok {
match => { "message" => "%{NGINXACCESS}" }

}

}

date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => ["datetime"]
}
geoip {
source => "clientip"
}

}
output {
if [fields][logsource] == "nginx_access"{
elasticsearch {
hosts => ["192.168.56.30:9200"]
index => "nginx_access"
}
}
if [fields][logsource] == "nginx_error"{
elasticsearch {
hosts => ["192.168.56.30:9200"]
index => "nginx_error"
}
}

stdout { codec => rubydebug }
}

修改完成後重新啓動logstash服務
/usr/local/logstash/bin/logstash /usr/local/logstash/config/kafka_log.conf

出現以上信息代表日誌分析成功。
前臺啓動無誤後切換爲後臺啓動
nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/kafka_log.conf.conf &

收集tomcat日誌
更改tomcat日誌格式
vim conf/server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="tomcat_access_log" suffix=".log pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>

修改完成後重新啓動tomcat

在logstash節點新建tomcat的配置文件
vim /usr/local/logstash/config/kafka1.conf
input{
kafka{
bootstrap_servers => "192.168.56.35:9092"
topics => "tomcat-filebeat"
consumer_threads => 1
decorate_events => true
codec => "json"
auto_offset_reset => "latest"

}
}

output {
elasticsearch {
hosts => ["192.168.56.30:9200"]
index => "tomcat-access-%{+YYYY.MM.dd}"
codec => "json"
}}
修改完成後重新啓動logstash

在tomcat節點安裝filebeat
vim /usr/local/filebeat/filebeat.yml
filebeat.prospectors:

  • type: log
    fields:
    logsource: tomcat_access
    log_type: access_log
    paths:
    • /usr/local/tomcat7/logs/tomcat_access_log*.log
      output.kafka:
      enabled: true
      hosts: ["192.168.56.35:9092"]
      topic: "tomcat-filebeat"
      partition.hash:
      reachable_only: true
      compression: gzip
      max_message_bytes: 1000000
      required_acks: 1
      logging.to_files: true

啓動filebeat

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章