一、架構如圖:

二、工作機制:
在需要收集日志的應用上安裝filebeat(需要修改配置文件,配置文件稍后介紹),啟動filebeat后,會收集該應用的日志推送給redis,然后logstash從redis中收集日志推送到Elasticsearch。
因Elasticsearch是一個集群,所以只需要在某台Elasticsearc安裝一個Kibana提供給用戶一個可視化界面即可。
而在學習Elasticsearch的過程中,必不可少需要通過一些工具查看es的運行狀態以及數據。如果都是通過rest請求,未免太過麻煩,而且也不夠人性化,所以需要安裝一個head插件。同上,只需要在某台Elasticsearc安裝一個head插件,提供給運維查看數據狀態即可。
三、 安裝准備
1、 安裝包
通過https://www.elastic.co/downloads,可以下載es所有需要的安裝包,可自行根據需要下載對應版本。
並且將包都解壓到/opt/platform
以下是目前es使用到的安裝包:
Elasticsearch5.2.X
安裝方法:
修改配置文件:vim /opt/platform/elasticsearch/config/elasticsearch.yml
配置詳見文件下文。
啟動ela: ./bin/elasticsearch
Filebeat5.2.X
安裝方法:
創建目錄:mkdir conf
復制配置文件:cp filebeat.yml /conf
修改配置文件:vim /opt/platform/filebeat/conf/filebeat.yml
配置詳見文件下文。
啟動filebeat: ./filebeat -c conf/filebeat.yml &
Logstash5.2.X
安裝方法:
創建目錄:mkdir conf
配置文件:vim /opt/platform/filebeat/conf/ filebeat-java-to-es.conf
配置詳見文件下文。
啟動logstash:/opt/platform/logstash/bin/logstash -f /opt/platform/logstash/conf/filebeat-java-to-es.conf &
Es-head5.2.x
安裝方法:
Github下載源碼:git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
安裝node依賴模塊:npm install
ln -s /opt/platform/es-head/node_modules/grunt/bin/grunt grunt
啟動es head插件的獨立服務:nohup grunt server &
或者nohup npm run start &
配置文件:
vim Gruntfile.js
port按需更改,默認9100
Kibana5.2.X
安裝方法:
修改配置文件:vim /opt/platform/kibana/config/kibana.yml
配置文件修改內容如下:
server.port: 5601
server.host: "x.x.x.x"
elasticsearch.url: http://x.x.x.x:9200
Redis3.2.8(常規安裝,不做介紹了)
Jdk1.8.0_121(常規安裝,不做介紹了)
2、 端口開放:
| redis+logstash |
6379\9600 |
| redis+logstash |
6379\9600 |
| redis+logstash |
6379\9600 |
| es+kibana |
9200\9300\5601 |
| es+head |
9100\9200\9300\ |
| Es |
9200\9300\ |
3、依賴包
elsticserch依賴於java1.8以上版本,需要安裝JDK1.8+,同樣logstash也需要依賴jdk,所以也需要安裝。
四、配置文件:
1、Elasticserch
1、elasticserch 啟動時需要設置vm.max_map_count和允許打開的最大文件描述符數量
(1)、修改vm.max_map_count
vi /etc/sysctl.conf
增加以下內容
vm.max_map_count=262144
(2)、修改允許打開的最大文件描述符數量
vim /etc/security/limits.d/10-nproc.conf * soft nproc 20480 * hard nproc 20480 root soft nproc unlimited root hard nproc unlimited * soft nofile 1048576 * hard nofile 1048576 ops soft memlock unlimited ops hard memlock unlimited
(3)、修改elstic的配置文件,以下是比較重要的參數;
- path.data and path.logs:elstiserch存放數據和日志的路徑。
- cluster.name:集群名稱,這個作為不同節點加入一個集群的最重要的依據
- node.name:每個節點的名稱
- network.host:每個節點監聽IP地址
- discovery.zen.ping.unicast.hosts:集群的自動發現功能
- discovery.zen.minimum_master_nodes:設置集群中有多少個master資格的節點,公式為:總結點/2+1
PS: 需要在elasticsearch的配置文件中加入以下內容,這樣head才能連接到elasticsearch查看集群狀態:
thread_pool.search.queue_size: 10000
http.cors.enabled: true
http.cors.allow-origin: "*"
2、Filebeat配置文件
#prospectors config
filebeat.prospectors:
- input_type: log
paths:
- /opt/platform/quarkloan-api-app/logs/convertor/convertorinfo.log
- /opt/platform/quarkloan-api-app/logs/convertor/convertorerror.log
encoding: plain
document_type: loanapi
multiline.pattern: ^[0-9]
multiline.negate: true
multiline.match: after
#global config
filebeat.registry_file: ${path.data}/registry-loanapi
#output.redis config
output.redis:
hosts: ["10.19.64.69:6379", "10.19.64.70:6379", "10.19.64.71:6379"]
key: filebeat-java
datatype: list
loadbalance: true
3、Logstash配置文件
input {
redis {
data_type => "list" #value type is STRING
key => "filebeat-java" #value type is STRING
host => "10.19.64.69" #value type is STRING
port => 6379 #value type is NUMBER,Default value is 6379
}
redis {
data_type => "list"
key => "filebeat-java"
host => "10.19.64.70"
port => 6379
}
redis {
data_type => "list"
key => "filebeat-java"
host => "10.19.64.71"
port => 6379
}
}
filter {
#JAVA日志解析,時間 線程 級別 類 ,日志實際內容不解析
grok {
match => {
"message" => "%{TIMESTAMP_ISO8601:timestamp}\s+%{DATA:thread}\s+%{DATA:level}\s+%{DATA:class}\s+"
}
}
#用日志輸出時間替換掉ES的@timestamp
date {
match => ["timestamp", "ISO8601"]
target => "@timestamp"
}
#節流過濾,打節流tag,output.email根據tag判斷是否發送ERROR日志郵件
if [type] == "loanapi" and [level] == "ERROR" {
throttle {
period => 600
max_age => 1200
before_count => 4
key => "%{type}%{level}"
add_tag => "throttled"
}
}
}
output {
elasticsearch {
hosts => ["10.19.64.72:9200", "10.19.64.105:9200", "10.19.64.106:9200"] #value type is ARRAY
index => "%{type}-%{+YYYY.MM.dd}" #YYYY.MM.dd get from @timestamp field
flush_size => 2000 #value type is NUMBER,Default value is 500
idle_flush_time => 5 #value type is NUMBER,Default value is 1
}
#按type,level,tags判斷是否發送ERROR日志郵件(此項為特殊要求,不建議用logstash進行日志發送,避免影響logstash的性能)
if [type] == "loanapi" and [level]== "ERROR" and "throttled" in [tags] {
email {
port => 465
address => "mail.xxx.com"
from => "logerror@xxx.com"
username => "xxxr"
password => "xxx"
authentication => "login"
contenttype => "text/plain; charset=UTF-8"
use_tls => true
subject => "ELK異常郵件:[%{[beat][hostname]}服務器]-[%{type}日志異常]"
to => "sss@qqq.com"
via => "smtp"
body => "%{message}"
}
}
}
五 、啟動kibana

當加入了新的日志到ELK中時,可以在management中新建index,如下圖



日志格式要求
目前線下java應用的日志輸出組件有兩個,logback和log4j,格式應滿足如下要求,以便於接入生產ELK,方便開發能快速查看生產日志。
日志輸出標准有如下建議請參考
1、請盡量使用log4j 2、日志文件編碼格式:UTF-8,請不要使用默認 3、日志文件rotate:按天,單文件容量不超過50MB 4、日志輸出的時間格式使用ISO8601(如yyyy-MM-dd HH:mm:ss.SSS),%d或%date默認輸出格式為ISO8601 5、日志輸出的字段分隔符使用tab,替換空格 6、日志輸出字段順序:date thread level class message 7、日志輸出Pattern建議如下: 8、Logback組件pattern:%date [%thread] %-5level [%logger] - %msg%n 9、Log4j組件pattern:%d [%t] %-5p [%c] - %m%n 10、日志路徑微服務日志路徑為/opt/jarapp/logs tomcat日志路徑為/opt/tomcat/logs
