前言
日志是我們分析系統運行情況、問題定位、優化分析等主要數據源頭。目前,主流的業務系統都采用了分布式、微服務的形式。如果想要查看日志,就需要從不同的節點上去查看,而且對於整個業務鏈路也非常不清晰。因此,我們首先引入日志收集框架,將分布在各個節點的日志統一匯總到一處。方便日志查詢、分析與問題定位。
根據我們目前的技術棧,我們的服務是在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+。
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文件。需要我們修改的項為:
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文件。需要我們修改的項為:
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。文件內容為:
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(可隨意)。在文件里定義自己的表達式:
# 自定義正則
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.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。安裝配置腳本如下:
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
-e
|
追加如下一行:
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搭建也是初次接觸,存在使用與認知錯誤是不可避免的,在此歡迎各位童鞋當面或留言指正,以上。