ELK+filebeat+redis架构![](https://i-blog.csdnimg.cn/blog_migrate/741909ed17e7fa0b2da93295f8a7222e.png)
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"]
#集群中过半投票才能选为master,如3个节点,此处为2,5个节点,此处为3
discovery.zen.minimum_master_nodes: 1
#是否支持跨域,默认为false
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 Tx.123456
使用及验证:
# redis-cli -h 192.168.0.34 -a Tx.123456
192.168.0.34>keys *
(logstash) 在filebeat中创建的索引名logstash,出现则为说明filebeat收集到的信息成功导入到了redis中
filebeat安装与配置:
直接通过rpm包yum/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-xx-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-xx-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;
location / {
proxy_pass http://192.168.0.56:5601;
}
}
其他elk问题: