自建elk+filebeat+grafana日誌收集平臺

歡迎關注我的公衆號「沒有故事的陳師傅」
搭建這個平臺的初衷只是爲了我和個人兩個小夥伴來更好的學習es以及周邊組件,欲善其事,必利其器,只是單純的去學習理論知識是不夠的,理論與操做相結合,才能學的更紮實。php

環境配置:

使用本身的兩臺1v2g阿里雲主機以及好友穎樅的一臺1v2g雲主機,共計三臺主機html

環境架構以下:

自建elk+filebeat+grafana日誌收集平臺

三臺主機的環境分別以下:

node1:elasticsearch6.4+filebeat
node2:kibana6.4+grafana+filebeat
node3:logstash+nginx+filebeat+Redis
因爲es很消耗內存,因此我只把es單獨運行在一個主機上,並設置主分片爲1,副本分片爲0,每週定時刪除上週的索引數據前端

日誌採集端配置

安裝Redis

redis服務器是logstash官方推薦的broker(代理人)選擇,broker角色也就意味着會同時存在輸入和輸出兩個插件,產生數據的被稱做生產者,而消費數據的被稱做消費者。java

redis消息隊列做用說明:

一、防止Logstash和ES沒法正常通訊,從而丟失日誌。
二、防止日誌量過大致使ES沒法承受大量寫操做從而丟失日誌。
三、應用程序(php,java)在輸出日誌時,能夠直接輸出到消息隊列,從而完成日誌收集。

補充:若是redis使用的消息隊列出現擴展瓶頸,可使用更增強大的kafka,flume來代替。node

編譯安裝Redis

wget http://download.redis.io/releases/redis-4.0.11.tar.gz  #下載Redis源碼
tar -zxf redis-4.0.11.tar.gz      #解壓Redis源碼
cp -r redis-4.0.11 /usr/local/    
mv redis-4.0.11/ redis
cd /usr/local/redis/
cp redis.conf bin/
make PREFIX=/usr/local/redis install     #編譯安裝Redis
echo "export PATH=$PATH:/usr/local/redis/bin" >> /etc/profile   將Redis加入環境變量

啓動Redis

1.前端模式啓動
直接運行bin/redis-server將之前端模式啓動,前端模式啓動的缺點是ssh命令窗口關閉則redis-server程序結束,不推薦使用此方法
redis-server
2.後端模式啓動
修改redis.conf配置文件, daemonize yes 之後端模式啓動mysql

vim /usr/local/redis/bin/redis.conf
daemonize yes

執行以下命令啓動redis:linux

redis-server redis.conf

鏈接redis
redis-clinginx

關閉Redis
強行終止redis進程可能會致使redis持久化數據丟失。正確中止Redis的方式應該是向Redis發送SHUTDOWN命令,命令爲:git

redis-cli shutdown

修改nginx日誌格式
nginx日誌默認格式爲log格式,傳輸到es中須要通過grok插件進行處理並轉換成json格式,這一過程是很消耗logstash資源的,並且傳入到es中的字段並不容易分析,因此在收集端先將日誌轉爲json格式,再傳入es中去,這樣傳入的字段也是利於分析的。
編輯nginx配置文件redis

vim /usr/local/nginx/conf/nginx.conf   #修改主配置文件,定義日誌格式
log_format json '{ "@timestamp": "$time_iso8601", '
                         '"time": "$time_iso8601", '
                         '"clientip": "$remote_addr", '
                         '"remote_user": "$remote_user", '
                         '"body_bytes_sent": "$body_bytes_sent", '
                         '"request_time": "$request_time", '
                         '"status": "$status", '
                         '"host": "$host", '
                         '"request": "$request", '
                         '"request_method": "$request_method", '
                         '"uri": "$uri", '
                         '"http_referrer": "$http_referer", '
                         '"body_bytes_sent":"$body_bytes_sent", '
                         '"http_x_forwarded_for": "$http_x_forwarded_for", '
                         '"http_user_agent": "$http_user_agent" '
                    '}';
   vim /usr/local/nginx/conf.d/default.conf #修改站點配置文件
   access_log /var/log/nginx/io.log json ;
   vim /usr/local/nginx/conf.d/doc.conf
   access_log  /var/log/nginx/doc.access.log json;

重載nginx
systemctl reload nginx

查看日誌格式
tail -f /var/log/nginx/io.log
自建elk+filebeat+grafana日誌收集平臺

安裝並配置filebeat

filebeat是一個輕量級的日誌採集器,因爲logstash比較消耗資源,不適合在每臺主機上部署logstash

使用RPM安裝filebeat

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.0.1-x86_64.rpm
rpm -vi filebeat-7.0.1-x86_64.rpm

配置filebeat收集nginx日誌

配置輸入端採集nginx日誌,根據字段類型不一樣輸出到Redis不一樣的key中,每種日誌存放在不一樣的key中,便於後續的處理

vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
    - /var/log/nginx/io.log
  fields:
    type: www_access
  fields_under_root: true
- type: log
  paths:
    - /var/log/nginx/io.error.log
  fields:
    type: www_error
  fields_under_root: true
- type: log
  paths:
    - /var/log/nginx/doc.access.log
  fields: 
    type: doc_access 
  fields_under_root: true
setup.template.settings:
  index.number_of_shards: 1
output.redis: 
   hosts: ["127.0.0.1:6379"]
   key: "nginx"
   keys: 
     - key: "%{[type]}"
processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

重啓filebeat

systemctl restart filebeat

進入Redis中查看日誌信息
redis-cli

獲取key的長度,key長度增長說明日誌已經寫入到Redis裏了,並且也能看到日誌的信息,下圖日誌信息仍是log格式的,由於json格式是後來修改的
自建elk+filebeat+grafana日誌收集平臺

日誌處理端配置

安裝並配置logstash

1.安裝logstash須要依賴Java8的環境,不支持Java9

使用yum install java命令安裝

2.下載並安裝公共簽名密鑰

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

3.添加logstash的yum倉庫

vim /etc/yum.repos.d/logstash.repo
[logstash-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

4.使用yum安裝logstash
yum install logstash

編寫日誌處理配置文件

定義Redis列表或者頻道名稱,以及Redis的數據類型,定義type以區分不一樣的日誌類型,使用json插件將message字段處理成json格式,並刪掉message字段,使用date插件定義新的時間戳,使用geoip插件根據客戶端IP來定位客戶端大致,默認是使用GeoLite2 city數據庫,此數據庫官網每兩週更新一次,若是對IP地址的準確性要求高,可寫一個定時任務,每兩週從官網下載新的數據庫,mutate插件用於修改字段數據類型,由於"coordinates"子字段不修改會默認爲keyword格式,這對於在kibana上建立座標地圖可能會不支持,關於以上插件的詳細信息可查看本人之前發的logstash的文章。

vim /etc/logstash/conf.d/test.conf
input {
    redis {
        host => "127.0.0.1"
        port => 6379
        type => "www_access"
        data_type => "list"
        key => "www_access"
        codec => "json"
    }  
    redis {
        host => "127.0.0.1"
        port => 6379
        type => "nginx_error"
        data_type => "list"
        key => "www_error"
    }
    redis {
        host => "127.0.0.1"
                port => 6379
                type => "doc_access"
                data_type => "list"
                key => "doc_access" 
                codec => "json"
    }
}
filter {
    if [type] == "www_access" {                                   
            json {
            source => "message"
            remove_field => "message"
            }
            date {
              match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]       
        }
        geoip {
          source => "clientip"
          fields => ["city_name", "country_code2", "country_name", "region_name","longitude","latitude","ip"]
              add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]                    
              add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]  
        }
        mutate {
              convert => [ "[geoip][coordinates]","float" ] 
        }   
    }
        else if [type] =~ "error" {                          
            grok {
            }
            date {
              match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
            }
        }
        else {
            json {
               source => "message"
                   remove_field => "message"
            }
            date {              
              match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]              }
            geoip {
                  source => "clientip"
                  fields => ["city_name", "country_code2", "country_name", "region_name","longitude","latitude","ip"]                
               add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]                    
                  add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]             }
           mutate {
            convert => ["[geoip][coordinates]","float"]
           }    
        }

}
output {
        if [type] == "www_access" {
      elasticsearch {
        hosts => ["60.205.177.168:9200"]
        index => "nginx_access-%{+YYYY.MM.dd}"
      }
      stdout {
                codec => rubydebug
          }
    }   
    else if [type] == "www_error" {
      elasticsearch {
        hosts => ["60.205.177.168:9200"]
        index => "nginx_error-%{+YYYY.MM.dd}"
      }
    }
    else {
      elasticsearch {
        hosts => ["60.205.177.168:9200"]
                index => "nginx_doc-%{+YYYY.MM.dd}"
      }
      stdout { 
        codec => rubydebug
          }
    }
}

啓動logstash

logstash -f /etc/logstash/conf.d/test.conf
再次進入Redis數據庫查看,發現日誌數據已經被消費掉了
自建elk+filebeat+grafana日誌收集平臺
自建elk+filebeat+grafana日誌收集平臺

日誌存儲分析端配置

安裝elasticsearch

elasticsearch一樣須要Java運行環境

1.下載elasticsearch的tar包

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

2.解壓包

tar -xzf elasticsearch-6.4.0.tar.gz

3.修改配置文件

[root@elastic elasticsearch-6.4.0]# vim config/elasticsearch.yml
修改內容以下:
cluster.name: my-elk     #設置集羣的名字
node.name: es1            #集羣中的節點名稱,同一集羣中的節點名稱不能重複
path.data: /elasticsearch/elasticsearch-6.4.0/data    #設置es集羣的數據位置
path.logs: /elasticsearch/elasticsearch-6.4.0/logs/    #設置存放日誌的路徑
network.host: 192.168.179.134       #綁定本地ip地址
http.port: 9200       #設置開放的端口,默認就是9200端口

4.啓動elasticsearch

cd elasticsearch-6.4.0/
./bin/elasticsearch

若是要將es後臺運行,能夠在命令後加-d
這裏要使用普通用戶運行,還要把目錄授予普通文件權限
chown -R elker.elker /elasticsearch

5.查看啓動狀態

輸入netstat -ntlp |grep 9200查看9200端口是否監聽,可使用curl 192.168.179.134:9200或者在瀏覽器上輸入192.168.179.134:9200進行查看啓動後的狀態
自建elk+filebeat+grafana日誌收集平臺

6.啓動過程出現的報錯

[WARN ][o.e.b.BootstrapChecks ] [PWm-Blt] max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

解決辦法:

vim /etc/security/limits.conf 
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

[WARN ][o.e.b.BootstrapChecks ] [PWm-Blt] max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

解決辦法:

vim /etc/sysctl.conf
vm.max_map_count=655360

修改完成執行命令:
sysctl -p

日誌可視化端配置

kibana安裝

kibana版本須與es版本一致

1.下載並解壓kibana包

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

2.修改kibana默認配置

vim kibana-6.4.0-linux-x86_64/config/kibana.yml
server.port: 5601                             #kibana默認端口是5601
server.host: "192.168.179.134"       #設置綁定的kibana服務的地址
elasticsearch.url: "http://192.168.179.134:9200"    #設置elasticsearch服務器的ip地址,不修改的話啓動的時候會報[elasticsearch] Unable to revive connection: http://localhost:9200/鏈接不上elasticsearch的錯誤

3.啓動kibana

/kibana-6.4.0-linux-x86_64/bin/kibana
netstat -ntlp |grep 5601   #能夠查看5601端口是否啓動

在瀏覽器輸入192.168.179.134:5601便可訪問kibana

4.出現的警告信息

雖然出現警告信息,不過仍是能夠啓動kibana的,本人有點強迫症,不想看到警告信息

警告信息1:[security] Generating a random key for xpack.security.encryptionKey. To prevent sessions from being invalidated on restart, please set xpack.security.encryptionKey in kibana.yml

解決方法:修改配置文件vim config/kibana.yml
在配置文件底部添加
xpack.reporting.encryptionKey: "a_random_string"

警告信息2:[security] Session cookies will be transmitted over insecure connections. This is not recommended.

解決方法:修改配置文件vim config/kibana.yml
在配置文件底部添加
xpack.security.encryptionKey: "something_at_least_32_characters"

5.檢查kibana狀態

在瀏覽器輸入192.168.179.134:5601/status查看kibana狀態,或者輸入http://192.168.179.134:5601/api/status查看json格式的詳細狀態

grafana安裝

1.下載RPM包並安裝

wget https://dl.grafana.com/oss/release/grafana-5.4.2-1.x86_64.rpm
yum install grafana-5.4.2-1.x86_64.rpm
yum install initscripts -y

2.啓動grafana

經過init.d方式啓動

service grafana-server start
/sbin/chkconfig --add grafana-server

經過systemd啓動

systemctl daemon-reload
systemctl start grafana-server
systemctl enable grafana-server.service

3.修改存儲數據庫爲mysql

默認使用sqlite3數據庫,能夠編輯配置文件/etc/grafana/grafana.ini,修改使用的數據庫,能夠選擇mysql或者postgres,默認數據庫文件位置/var/lib/grafana/grafana.db
建立grafana數據庫

create database grafana character set utf8 collate utf8_general_ci;

編輯grafana配置文件

vim /etc/grafana/grafana.ini
在[database]段下添加如下內容
type = mysql
host = 192.168.179.131:3306
name = grafana
user = root
password = "123456"

重啓grafana會報一個錯,由於我使用的是mysql8.0的數據庫,他不支持受權方法caching_sha2_password,解決方法是配置root用戶使用mysql_native_password身份驗證插件鏈接器

reason="Service init failed: Migration failed err: this authentication plugin is not supported

alter user root@'%' identified with mysql_native_password by '123456';
select user, plugin from mysql.user;

4.添加數據源

首先添加一個elasticsearch的數據源
自建elk+filebeat+grafana日誌收集平臺
自建elk+filebeat+grafana日誌收集平臺
自建elk+filebeat+grafana日誌收集平臺
自建elk+filebeat+grafana日誌收集平臺
自建elk+filebeat+grafana日誌收集平臺

使用kibana展現數據

數據展現完成以下所示
自建elk+filebeat+grafana日誌收集平臺
自建elk+filebeat+grafana日誌收集平臺
自建elk+filebeat+grafana日誌收集平臺

下面開始進行逐一添加

建立訪問IP排行

首先建立一個柱形圖
自建elk+filebeat+grafana日誌收集平臺
選擇索引模式或者保存的搜索
自建elk+filebeat+grafana日誌收集平臺
定義x軸信息,並把clientip字段做爲求和的值
自建elk+filebeat+grafana日誌收集平臺
單擊保存就能夠建立圖形了

建立訪問IP的座標地圖

這一項須要依賴geoip插件,座標地圖須要有地理座標的數據類型geo_point存在,可是es建立動態映射不會定義這些特殊的數據類型,這就須要咱們本身定義映射模板,mapping信息能夠複製以前自動建立的映射內容,而後修改coordinate的數據類型爲geo_point就能夠了,mapping信息能夠從這裏複製。
自建elk+filebeat+grafana日誌收集平臺
而後咱們在dev tools中定義索引的模板,下圖是我以前定義好的模板,建立模板使用put請求,
關於geo_point數據類型能夠查看
官方文檔
自建elk+filebeat+grafana日誌收集平臺
自建elk+filebeat+grafana日誌收集平臺

修改完以後能夠刪除索引並從新生成新的索引,而後須要刪除索引模式,並從新建立索引模式,否則地圖上可能會沒有數據。
建立座標地圖
自建elk+filebeat+grafana日誌收集平臺
選擇索引模式
自建elk+filebeat+grafana日誌收集平臺
選擇具備geo_point類型的字段
自建elk+filebeat+grafana日誌收集平臺
保存以後就能夠看到正常的地圖了

使用grafana展現數據

建立一個博客訪問量的圖形

自建elk+filebeat+grafana日誌收集平臺
自建elk+filebeat+grafana日誌收集平臺
自建elk+filebeat+grafana日誌收集平臺
自建elk+filebeat+grafana日誌收集平臺


歡迎各位關注個人公衆號"沒有故事的陳師傅"
自建elk+filebeat+grafana日誌收集平臺

相關文章
相關標籤/搜索