ELK+filebeat+redis架構
es+kibana:192.168.0.56 es創建索引/存儲,kibana展示
logstash:192.168.0.57 日誌正則過濾
redis:192.168.0.34 消息隊列(緩衝)
filebeat:192.168.0.32/33 收集nginx日誌
nginx:192.168.0.32 nginx反向代理
一、安裝
ELK依賴jdk,jdk安裝參考:https://blog.csdn.net/weixin_41988331/article/details/90261370
準備環境:centos6/7,全部採用yum/rpm安裝,其中es需要大磁盤存放數據,默認數據存放路徑爲/var/lib/elasticsearch,可自行更改
ELK+filebeat:所有版本均爲此刻最新的6.6.1,官網直接下載rpm包,然後直接yum/rpm安裝,其中es/kibana/filebeat,service/systemctl命令添加到開機自啓,logstash通過rc.local實現開機自啓
官網下載地址:https://www.elastic.co/cn/downloads/
elasticsearch安裝:
準備:修改系統配置,es對系統參數有要求
# vim /etc/sysctl.conf
vm.max_map_count = 655360 #定義了一個進程能擁有的最多的內存區域
# sysctl -p
# vim /etc/security/limits.conf #文件描述符
* soft nofile 65535
* hard nofile 65535
# vim /etc/security/limits.d/20-nproc.conf
* soft nproc 4096
root soft nproc unlimited
爲什麼要限制打開的文件描述符?
原因1 – 資源問題:每個打開的文件都需要消耗內存來管理,而內存是有限的。
原因2 – 安全問題:如果不限制的話,有不懷好心的人啓動一個進程來無限的創建和打開新的文件,會讓服務器崩潰。
所以限制文件描述符的數量對於linux系統的穩定性是非常重要的。
直接yum install elasticsearch.xxx.rpm或者rpm -ivh elasticsearch.xxx.rpm
修改配置:
# vim /etc/elasticsearch/elasticsearch.yml
單點配置
cluster.name: tx-elk
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.0.56
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.0.56"]
discovery.zen.minimum_master_nodes: 1
http.cors.enabled: true
http.cors.allow-origin: "*"
集羣配置:修改以下三項
node.name: node-1
discovery.zen.ping.unicast.hosts: ["192.168.0.56"]
discovery.zen.minimum_master_nodes: 1
# systemctl start elasticsearch
# systemctl enable elasticsearch
kibana安裝與配置:
直接yum install kibana.xxx.rpm或者rpm -ivh kibana.xxx.rpm
修改配置:
# vim /etc/kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.0.56:9200"] #ES集羣中任一es即可
# systemctl start kibana
# systemctl enable kibana
logstash安裝
logstash配置修改後,特別是索引匹配修改後,需重啓es
直接rpm安裝即可,可執行文件路徑如下,添加到ENV:
/usr/share/logstash/bin/logstash -f filebeat-redis-logstash.conf
remove_field =>["message"]
https://blog.csdn.net/zhaoyangjian724/article/details/54343178
geoip
https://blog.csdn.net/wanglei_storage/article/details/82663184
grok參考
https://www.jianshu.com/p/134d0f9a367a
https://www.cnblogs.com/lize3379/p/6118788.html
https://blog.csdn.net/mergerly/article/details/53310806
http://grokdebug.herokuapp.com/
最終filebeat-redis-logstash.conf配置如下:目前在做了收集nginx日誌,後續會做收集tomcat日誌的grok匹配規則
其中nignx的日誌格式:
log_format main '$remote_addr $remote_user [$time_local] $request '
'$status $body_bytes_sent $http_referer "$upstream_response_time" $request_time '
'"$http_user_agent" $http_x_forwarded_for $http_host "$upstream_addr" "$http_auth_token"';
# 因upstream地址池中server個數有多個,在後端故障時,$upstream_response_time、$upstream_addr會有server個數個結果,並以逗號隔開,如0.000, 0.000以及1.1.1.1, 1.1.1.2,所以這兩處同$http_user_agent一樣用引號並在一起
#用於nginx日誌+tomcat日誌
input {
redis {
host => "192.168.0.57"
port => 6379
password => "Tx.123456"
db => "0"
data_type => "list"
key => "logstash"
}
}
filter {
grok {
match => {
"message" => "%{IP:ip} %{USER:auth} \[%{HTTPDATE:timestamp}\] %{WORD:request_method} %{URIPATHPARAM:uri} HTTP/%{NUMBER:http_version} %{NUMBER:status} %{NUMBER:filesize} (?:%{URI:referrer}|-) \"%{GREEDYDATA:upstream_time}\" %{NUMBER:request_time} \"%{GREEDYDATA:ua}\" (?:%{IP:x_forward}|-) %{HOSTNAME:domain} \"%{GREEDYDATA:upstream_host}\" \"%{GREEDYDATA:auth_token}\""
}
remove_field =>["message", "port", "auth_token"]
}
#mutate {
# remove_field =>["message", "port"]
#remove_field =>["port", "auth_token"]
#}
#geoip {
# source => "client"
# database => "/etc/logstash/GeoLite2-City_20190326/GeoLite2-City.mmdb"
# fields => ["country_name","region_name", "city_name"]
#}
}
output {
if "nginx-prod" in [tags] {
elasticsearch {
hosts => ["192.168.0.57:9200"]
index => "nginx-prod-%{+YYYY.MM.dd}"
}
}
if "nginx-beta" in [tags] {
elasticsearch {
hosts => ["192.168.0.57:9200"]
index => "nginx-beta-%{+YYYY.MM.dd}"
}
}
if "nginx-test" in [tags] {
elasticsearch {
hosts => ["192.168.0.57:9200"]
index => "nginx-test-%{+YYYY.MM.dd}"
}
}
if "tomcat-uc" in [tags] {
elasticsearch {
hosts => ["192.168.0.57:9200"]
index => "tomcat-uc-%{+YYYY.MM.dd}"
}
}
}
redis安裝與配置
【若日誌量大,redis可提高配置縱向擴展,也可做集羣或者單純增加redis數量進行橫向擴展(不同日誌發到不同redis、logstash),若日誌量超大,也可換成zookeeper+kafka集羣】
版本3.2,直接yum安裝,service/systemctl命令添加到開機自啓,修改以下兩處,讓除自己以外的機器訪問,以及設置連接密碼
#vim /etc/redis.conf
bind 0.0.0.0
requirepass 123456
使用及驗證:
# redis-cli -h 192.168.0.34 -a Tx.123456
192.168.0.34>keys *
(logstash) 在filebeat中創建的索引名logstash,出現則爲說明filebeat收集到的信息成功導入到了redis中
filebeat安裝與配置:
直接通過rpm包安裝即可,若filebeat->logstash進行測試,直接將Logstash output部分取消註釋,將其他redis output 部分註釋,若filebeat->redis->logstash,則不更改此配置文件
filebeat.inputs:
#======== nginx訪問日誌 =============
- type: log
enabled: true
paths:
- /apps/log/nginx/*.access.log
tags: ["nginx-prod"]
#======== Java類日誌,以年月日開頭 =============
- type: log
enabled: true
paths:
- /apps/logs/xxx/error.log
multiline.pattern: '^\d{4}'
multiline.negate: true
multiline.match: after
tags: ["dev-bange-module-auth"]
#============================= Filebeat modules ===============================
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.kibana:
#================================ Outputs =====================================
#-------------------------- redis output ------------------------------------
output.redis:
hosts: ["192.168.0.57"]
port: 6379
password: "Tx.123456"
key: "logstash"
db: 0
timeout: 5
data_type: "list"
#----------------------------- Logstash output --------------------------------
#output.logstash:
# The Logstash hosts
#hosts: ["192.168.0.57:5044"]
#index: log
# systemctl start filebeat
# systemctl enable filebeat
filebeat配置拓展
# 在輸入中排除符合正則表達式列表的那些行,paths後添加
exclude_lines: ["^DBG"]
如線上將DEBUG級別的tomcat日誌全部去掉了
exclude_lines: ["DEBUG"]
多日誌文件合併爲一個的
paths:
- /var/log/java/test-java.log
- /var/log/java/*.log
- /var/log/*/*.log
多日誌文件單獨的,直接複製整個type
#======== Java類日誌,以年月日開頭 =============
- type: log
enabled: true
paths:
- /apps/logs/xxx/error.log
multiline.pattern: '^\d{4}' #正則匹配,如此處以年開頭的4位整數,也有以'\[',即以[開頭的
multiline.negate: true
multiline.match: after
tags: ["dev-bange-module-auth"]
negate有false和true兩種取值,match也有after和before兩種取值。下面詳述:
negate參數爲false,表示“否定參數=false”。multiline多行參數負負得正,表示符合pattern、match條件的行會融入多行之中、成爲一條完整日誌的中間部分。如果match=after,則以xx開頭的和前面一行將合併成一條完整日誌;如果match=before,則以b開頭的和後面一行將合併成一條完整日誌。
negate參數爲true,表示“否定參數=true”。multiline多行參數爲負,表示符合match條件的行是多行的開頭,是一條完整日誌的開始或結尾。如果match=after,則以xx開頭的行是一條完整日誌的開始,它和後面多個不以xx開頭的行組成一條完整日誌;如果match=before,則以xx開頭的行是一條完整日誌的結束,和前面多個不以xx開頭的合併成一條完整日誌。
本例中使用multiline.negate: true和multiline.match: after,合起來的意思就是符合multiline.pattern: '^\d{4}'作爲一條完整日誌的開始,後面的不以4位整數開頭的,直到下一個4位整數開頭的日誌之前的內容都合併到這條日誌的後面,算作一條日誌
如典型的java日誌:
2019-11-14 10:37:30.460 [xxxx_80-506217ce-807d-433b-9051-918b05682b50] [] ERROR com.xxx.client.config.impl.ClientWorker - [fixed-xxx_80-506217ce-807d-433b-9051-918b05682b50] [check-update] get changed dataId exception
java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:851)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:848)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
關於negate和match的原文鏈接:https://blog.csdn.net/xh6312643/article/details/80216153
nginx反向代理kibana
server {
listen 80;
server_name log.xxx.com;
access_log /etc/nginx/logs/log.xxx.com.access.log main;
proxy_pass http://192.168.0.56:5601;
}
}
其他elk問題: