日誌收集系統搭建-BELK

前言

    日誌是咱們分析系統運行狀況、問題定位、優化分析等主要數據源頭。目前,主流的業務系統都採用了分佈式、微服務的形式。若是想要查看日誌,就須要從不一樣的節點上去查看,並且對於整個業務鏈路也很是不清晰。所以,咱們首先引入日誌收集框架,將分佈在各個節點的日誌統一彙總到一處。方便日誌查詢、分析與問題定位。html

    根據咱們目前的技術棧,咱們的服務是在spring cloud下搭建的。於是使用spring sleuth搭建日誌收集是快而便捷的。我的使用spring sleuth + kafka +zipkin + mysql,搭建起一個系統間的trace日誌追蹤系統。該套框架的優點在於,使用簡單(只要引入本身封裝好的starter,指定kafka及zookeeper地址便可)。spring sleuth會自動攔截http請求,並分配統一trace id來追蹤這一次的請求全鏈路。最後,經過zipkin的可視化頁面,咱們能很是方便的看出一次請求的整個鏈路,並且能直觀的看出各個系統的耗時,對於性能分析比較有幫助。可是,相較於本文要說的ELK日誌系統而言,spring sleuth仍是有幾個明顯的缺點的:node

    1. spring sleuth只會獲取過濾到的http請求信息,對於收集系統打印的業務日誌信息較麻煩,可定製化相較於ELK太差。(這也是選擇ELK的主要緣由)mysql

    2. spring sleuth的日誌生成、收集、生產、消費,都共同消耗服務資源。linux

    反觀ELK,有兩種選擇,便可以嵌入到系統(使用log4j的socket發送日誌到ELK),也能夠獨立存在(logstash直接讀取日誌文件)。並且,對於日誌文件中內容的獲取,有更靈活的配置(基於logstash的filter插件)。So, it's ELK!git

    最後再說一點,說了這麼多,應該都知道ELK指的是elasticsearch+logstash+kibana。對於logstash,若是你的server所在的機器上,資源比較緊張,那麼能夠選擇elastic家族中的Filebeat來作server日誌的收集工做。這也正是官方所推薦的(The Filebeat client is a lightweight, resource-friendly tool that collects logs from files on the server and forwards these logs to your Logstash instance for processing. Filebeat is designed for reliability and low latency. Filebeat has a light resource footprint on the host machine, and the Beats input plugin minimizes the resource demands on the Logstash instance.)。咱們日誌系統的搭建也是使用了Filebeat來收集日誌,統一彙總到日誌系統的logstash,而後再由logstash將日誌信息推送到elasticsearch。在此,暫且叫BELK。用一個圖來形象的表述一下關係:github

1. 環境準備

    首先,咱們須要準備日誌系統須要的環境。正則表達式

    1. JRE須要1.8+。spring

    2. ES等須要建立文件限制提高到65536+;虛擬內存區域最大數量262144+。sql

bash
vi  /etc/security/limits .conf
# 添加下面內容
test  - nofile 65536   # test爲操做帳號
vi  /etc/sysctl .conf
# 添加下面內容
vm.max_map_count=262144
# 保存並生效
sysctl -p

2. 安裝elasticsearch

    1. 到官網下載壓縮包。本例使用的是6.2.2版本。elasticsearch-6.2.2.zip。json

    2. 解壓:unzip elasticsearch-6.2.2.zip -d /sinochem/software/elasticsearch-6.2.2

    3. 配置文件修改。配置文件在解壓目錄中的./config下的elasticsearch.yml文件。須要咱們修改的項爲:

         

elasticsearch.yml
cluster.name: es-application # 集羣名字
 
node.name: node-1 # 當前節點名字
 
path.data: /sinochem/software/elasticsearch-6.2.2/data # es數據存放路徑
 
path.logs: /sinochem/software/elasticsearch-6.2.2/logs # es日誌路徑
 
network.host: 10.144.132.70 # 當前節點IP地址
 
http.port: 9200 # 監聽端口號

 

    4. 啓動服務。nohup ./bin/elasticsearch >/dev/null & 

    注:目前ES只是單機模式,後續升級支持集羣模式。

3. 安裝Kibana    

    1. 到官網下載壓縮包。本例使用的是6.2.2版本。kibana-6.2.2-linux-x86_64.tar.gz。

    2. 解壓:tar -zxvf kibana-6.2.2-linux-x86_64.tar.gz

    3. 配置文件修改。配置文件在解壓目錄中的./config下的kibana.yml文件。須要咱們修改的項爲:

         

kibana.yml
server.port: 5601 # 服務端口
 
server.host: "10.xxx.xxx.xxx" # 服務IP地址
 
kibana.index: ".kibana" # kibana在es中的索引

 

    4. 啓動服務。nohup ./bin/kibana >/dev/null &

4. 安裝Logstash

    1. 到官網下載壓縮包。本例使用的是6.2.2版本。logstash-6.2.2.tar.gz。

    2. 解壓:tar -zxvf logstash-6.2.2.tar.gz

    3. 配置文件修改。配置文件在解壓目錄中的./config下新增日誌配置文件logstash.conf。文件內容爲:

         

logstash.conf
input {
     # beat插件,監聽5044端口
     beats {
         port => "5044"
     }
}
filter {
     grok {
         match => [ "message", "%{COMBINEDAPACHELOG}" ]
     }
     date {
         match => [ "timestamp", "yyyy-MM-dd HH:mm:ss.SSS" ]
     }
}
output {
     # 日誌輸出到ES
     elasticsearch {
         hosts => ["10.xxx.xxx.xxx:9200"]
         index => "logstash-%{+YYYY.MM.dd}"
     }
}

 

    4. 啓動服務。nohup ./bin/logstash -f config/logstash.conf --config.reload.automatic >/dev/null &

    5. 日誌匹配。

        COMBINEDAPACHELOG基本能知足日誌收集需求,若是你想要更加精確的收集本身須要的日誌。能夠定義本身的正則表達式。grok插件中,自帶了一些默認表達式,能夠經過https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns 中列舉的查看並使用。固然,你也能夠直接使用正則表達式。若是想定義本身的,能夠在./config(我的喜愛)下,建立本身的正則表達式文件,取名patterns(可隨意)。在文件裏定義本身的表達式:

patterns
# 自定義正則
MILLISECOND [0-9]{3}
DATA2END [\s\S]*
SINOCHEM_TIME %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:%{MINUTE}:%{SECOND}.%{MILLISECOND}

    而後,就能夠在上邊建立的logstash.conf中使用了,詳細配置以下:

input {
     # file {
     #     path => "/letv/message-bus-ilive/logs/chat_gate.log"
     #     type => "producer"
     #     start_position => "beginning"
     #     codec => json
     # }
     beats {
         port => "5044"
     }
}
filter {
     grok {
         # 此處指定自定義的patterns的路徑
         patterns_dir => ["./config/patterns"]
         match => {
             # 此處就可使用自定義的變量了
             "message" => ["%{COMBINEDAPACHELOG}","%{SINOCHEM_TIME:time}%{SPACE}%{DATA:thread}%{SPACE}%{LOGLEVEL:loglevel}%{SPACE}\[%{DATA:class}\]%{SPACE}\[%{DATA:traceId},%{DATA:spanId}\]%{SPACE}-%{SPACE}%{DATA2END:message}"]
         }
         # 重寫message內容
         overwrite => ["message"]
         remove_field => ["beat"]
     }
}
output {
     elasticsearch {
         hosts => ["10.144.132.70:9200"]
         index => "logstash-%{+YYYY.MM.dd}"
     }
}

    其中SINOCHEM_TIME、DATA2END就是咱們在patterns文件中自定義的變量。

5. 安裝Filebeat

    以上幾個都是安裝在ELK系統體系下的,Filebeat須要安裝到各個服務所在機器上。Filebeat使用的是6.3.0版本,使用該版本是爲了使用其中的processors。固然以上也可使用6.3.X版本。

    1. 到官網下載壓縮包。filebeat-6.3.0-linux-x86_64.tar.gz。

    2. 解壓:tar -zxvf filebeat-6.3.0-linux-x86_64.tar.gz

    3. 配置文件修改。配置文件在解壓目錄中的./config下的filebeat.yml文件。簡單配置以下:

filebeat.yml
filebeat.inputs:
# 用戶自定義部分 start
- type: log
   paths:
     # 日誌文件
     - /sinochem/app/cooperation/monitor-gateway/logs/*-info.log
   exclude_lines: ['^DBG']
   fields:
     # 服務名稱
     app_name: monitor-gateway
   fields_under_root: true
 
- type: log
   paths:
     - /sinochem/app/cooperation/monitor-admin-service/logs/*-info.log
   exclude_lines: ['^DBG']
   fields:
     app_name: monitor-admin-service
   fields_under_root: true
# 用戶自定義部分 end
 
output.logstash:
   hosts: ["10.xxx.xxx.xxx:5044"]
 
fields:
   # 須要用戶設置環境變量,或者直接將本機IP替換變量
   ip_address: "${IP_ADDRESS:UNKNOWN}"
fields_under_root: true
 
processors:
- drop_fields:
   fields: ["host"]
# - add_host_metadata: ~
# - decode_json_fields:
#      fields: ["host"]
 
filebeat.shutdown_timeout: 5s

 

    4. 啓動服務。nohup ./bin/filebeat -e -c config/filebeat.yml -d publish >/dev/null &

6. 定時清理索引

    ES中的日誌索引增速是可預見的,用太大的存儲空間來存儲日誌信息是不明智的。因此,可根據實際狀況,給予一個清理日誌的經驗值。因爲咱們創建logstash的日誌索引是按照日期創建的,咱們在這裏能夠只留15天的日誌信息。清理ES索引,使用了elasticsearch-curator。安裝配置腳本以下:

 

curator_install.sh
sudo  -i
# public signing key
rpm -- import  https: //packages .elastic.co /GPG-KEY-elasticsearch
# edit yum install info
echo  '[curator-5]
name=CentOS /RHEL  7 repository  for  Elasticsearch Curator 5.x packages
baseurl=https: //packages .elastic.co /curator/5/centos/7
gpgcheck=1
gpgkey=https: //packages .elastic.co /GPG-KEY-elasticsearch
enabled=1
' >  /etc/yum .repos.d /curator .repo
# install
yum  install  elasticsearch-curator
cd  /opt/elasticsearch-curator
mkdir  config
mkdir  log
echo  "actions:
   1:
     action: delete_indices
     description: >-
       Delete indices older than 15 days  for  logstash-
     options:
       ignore_empty_list: True
       # disable_action: True
     filters:
     - filtertype: pattern
       kind: prefix
       value: logstash-
     - filtertype: age
       source : name
       direction: older
       timestring:  '%Y.%m.%d'
       unit: days
       unit_count: 15" >  /opt/elasticsearch-curator/config/action .yml
echo  "client:
   hosts:
     - 10.144.132.70:9200
   # port: 9200
   url_prefix:
   use_ssl: False
   certificate:
   client_cert:
   client_key:
   ssl_no_validate: False
   http_auth:
   timeout: 50
   master_only: False
logging:
   loglevel: DEBUG
   logfile:  '/opt/elasticsearch-curator/log/curator.log'
   logformat: default
   blacklist: [ 'elasticsearch' 'urllib3' ]" >  /opt/elasticsearch-curator/config/config .yml

    安裝完後,配置crontab。

crontab.sh
crontab  -e

    追加以下一行:

crontab
10 1 * * * curator --config  /opt/elasticsearch-curator/config/config .yml  /opt/elasticsearch-curator/config/action .yml

 

後記

    至此,基礎版本的BELK系統已經搭建完成。咱們能夠在瀏覽器中輸入:http://10.xxx.xxx.xxx:5601/ 訪問ES的可視化界面。以下圖所示,日誌信息已經彙總到了ES中。

    目前版本只是雛形,其中還有一些功能須要完善。例如:ES集羣的搭建、ES索引、ES歷史數據的處理等。ELK搭建也是初次接觸,存在使用與認知錯誤是不可避免的,在此歡迎各位童鞋當面或留言指正,以上。

相關文章
相關標籤/搜索