日誌是咱們分析系統運行狀況、問題定位、優化分析等主要數據源頭。目前,主流的業務系統都採用了分佈式、微服務的形式。若是想要查看日誌,就須要從不一樣的節點上去查看,並且對於整個業務鏈路也很是不清晰。所以,咱們首先引入日誌收集框架,將分佈在各個節點的日誌統一彙總到一處。方便日誌查詢、分析與問題定位。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. JRE須要1.8+。spring
2. ES等須要建立文件限制提高到65536+;虛擬內存區域最大數量262144+。sql
vi
/etc/security/limits
.conf
# 添加下面內容
test
- nofile 65536
# test爲操做帳號
vi
/etc/sysctl
.conf
# 添加下面內容
vm.max_map_count=262144
# 保存並生效
sysctl -p
|
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文件。須要咱們修改的項爲:
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只是單機模式,後續升級支持集羣模式。
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 &
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文件中自定義的變量。
以上幾個都是安裝在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 &
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搭建也是初次接觸,存在使用與認知錯誤是不可避免的,在此歡迎各位童鞋當面或留言指正,以上。