日志收集系統搭建-BELK


前言

    日志是我們分析系統運行情況、問題定位、優化分析等主要數據源頭。目前,主流的業務系統都采用了分布式、微服務的形式。如果想要查看日志,就需要從不同的節點上去查看,而且對於整個業務鏈路也非常不清晰。因此,我們首先引入日志收集框架,將分布在各個節點的日志統一匯總到一處。方便日志查詢、分析與問題定位。

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

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

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

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

    最后再說一點,說了這么多,應該都知道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。用一個圖來形象的表述一下關系:

1. 環境准備

    首先,我們需要准備日志系統需要的環境。

    1. JRE需要1.8+。

    2. ES等需要創建文件限制提升到65536+;虛擬內存區域最大數量262144+。

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。

    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搭建也是初次接觸,存在使用與認知錯誤是不可避免的,在此歡迎各位童鞋當面或留言指正,以上。

 


免責聲明!

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



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