当日志的数量非常多的时候,可能需要引入缓存层作为临时存储数据的地方,防止因为ES处理不过来导致日志丢失的情况。
filebeat支持将日志发送到redis或者kafka作为消息队列缓存。
但是使用了缓存层,就不能使用模版来配置日志收集了。
所以最好日志是json格式
实验环境:
192.168.189.118----->elk01 nginx filebeat redis logstash es
redis logstash 也可以分开安装在不同的服务器
filebeat 安装参照前面文档
nginx 直接yum 安装,把nginx 日志,转成json格式。
vim /etc/nginx/nginx.conf
log_format json '{ "time_local": "$time_local", '
'"remote_addr": "$remote_addr", '
'"referer": "$http_referer", '
'"request": "$request", '
'"status": $status, '
'"bytes": $body_bytes_sent, '
'"agent": "$http_user_agent", '
'"x_forwarded": "$http_x_forwarded_for", '
'"up_addr": "$upstream_addr",'
'"up_host": "$upstream_http_host",'
'"upstream_time": "$upstream_response_time",'
'"request_time": "$request_time"' ' }';
+++++ 安装redis
mkdir -p /data/soft
mkdir -p /usr/local/redis_cluster/redis_6379/{conf,logs,pid}
mkdir -p /data/redis_cluster/redis_6379
cd /data/soft/
wget http://download.redis.io/releases/redis-5.0.8.tar.gz
tar zxf redis-5.0.8.tar.gz -C /usr/local/redis_cluster/
cd /usr/local/redis_cluster/
ln -s redis-5.0.8 redis
cd redis ##已经预编译了,直接make make install
make ## 编译并生成二进制命令
make install ## 把 生成的命令复制到/usr/local/bin下面
cd /usr/local/redis_cluster/redis_6379/conf
vim redis_6379.conf
# 以守护进程模式启动
daemonize yes
# 绑定的主机地址
bind 192.168.189.118
# 监听端口
port 6379
# pid 文件和log文件的保存地址
pidfile /usr/local/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /usr/local/redis_cluster/redis_6379/logs/redis_6379.log
# 设置数据库的数量,默认数据库为0
databases 16
# 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
# 本地数据库的目录
dir /data/redis_cluster/redis_6379
+++++++
启动redis
redis-server
/usr/local/redis_cluster/redis_6379/conf/redis_6379.conf
登录命令界面:
redis-cli
关闭redis-server
redis-cli -h 192.168.189.118 shutdown
也可以登录命令界面:直接输入 shutdown
++++++++++++++
先配置filebeat往redis里面写数据,修改filebeat的配置文件
官方文档:https://www.elastic.co/guide/en/beats/filebeat/6.6/redis-output.html
vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
json.keys_under_root: true
json.overwrite_keys: true
tags: ["access"]
########## output
output.redis:
hosts: ["192.168.189.118"]
key: "filebeat"
db: 0
timeout: 5
保存,退出。重启filebeat
模拟一些nginx 访问日志
登录redis,查看是否有写入内容。
lrange filebeat 1 34 ##查看值
安装logstash
下载:
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.6.0.rpm
##官网下载非常慢
wget http://www.xchinagroup.top/softdown/centos7/13_elk/logstash-6.6.0.rpm
rpm -ivh logstash-6.6.0.rpm
+++++++++++++++++
logstash 所有配置文件都放在/etc/logstash/conf.d
cd /etc/logstash/conf.d
input {
redis {
host => "192.168.189.118"
port => "6379"
db => "0"
key => "filebeat"
data_type => "list"
}
}
filter {
mutate {
convert => ["upstream_time", "float"]
convert => ["request_time", "float"]
}
}
output {
stdout {}
elasticsearch {
hosts => "http://192.168.189.118:9200"
manage_template => false
index => "nginx-acc-redis-%{+yyyy.MM}"
}
}
保存,退出。启动logstash
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/logstash
logstash -f /etc/logstash/conf.d/redis.conf
启动比较慢
ES查看数据:
Redis查看数据:
logstash 会从redis中读取数据,读取一条,redis里面就少一条,读完后,redis 里面就没有数据了。
++++++++++++
filebeat 根据tag判断,写入不同的key到redis,logstash读取不同的key写入ES
vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
json.keys_under_root: true
json.overwrite_keys: true
tags: ["access"]
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
tags: ["error"]
########## output
output.redis:
hosts: ["192.168.189.118"]
keys:
- key: "nginx_redis_acc"
when.contains:
tags: "access"
- key: "nginx_redis_err"
when.contains:
tags: "error"
保存退出。重启filebeat
先停止logstash,生成一些模拟nginx 的access和error数据
ab -n 20 -c 20 http://192.168.189.118/
ab -n 20 -c 20 http://192.168.189.118/yyy.php
登录redis 查看有没有两个key
redis-cli -h 192.168.189.118
修改logstash 下面的redis.conf 文件,加入判断。
vim /etc/logstash/conf.d/redis.conf
input {
redis {
host => "192.168.189.118"
port => "6379"
db => "0"
key => "nginx_redis_acc"
data_type => "list"
}
redis {
host => "192.168.189.118"
port => "6379"
db => "0"
key => "nginx_redis_err"
data_type => "list"
}
}
filter {
mutate {
convert => ["upstream_time", "float"]
convert => ["request_time", "float"]
}
}
output {
stdout {}
if "access" in [tags] {
elasticsearch {
hosts => "http://192.168.189.118:9200"
manage_template => false
index => "nginx-redis-access-%{+yyyy.MM}"
}
}
if "error" in [tags] {
elasticsearch {
hosts => "http://192.168.189.118:9200"
manage_template => false
index => "nginx-redis-error-%{+yyyy.MM}"
}
}
}
保存,退出。
清空ES里面原来的索引数据
重启,logstash
logstash -f /etc/logstash/conf.d/redis.conf
查看ES数据:
登录Kibana 创建索引数据:
+++++++++ 优化配置:
logstash 根据tags 里面的值,判断 并写入不同的索引到ES
那么logstash 的 tags数据又是从那里来的?
logstash 的tags 数据 是redis里面来的
redis 里面的key 带有tags ,redis 的tags 又是从Filebeat 给的
由比可以看出,整个过程,其实根key没有什么关系。
因此我们就可以对filebeat 和 logstash 进行优化
优化后的filebeat.yml 配置:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
json.keys_under_root: true
json.overwrite_keys: true
tags: ["access"]
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
tags: ["error"]
########## output
output.redis:
hosts: ["192.168.189.118"]
keys:
- key: "filebeat"
## filebeat 读取nginx 日志,都写入一个key
++++++++++
logstash 优化后的配置文件:
vim /etc/logstash/conf.d/redis.conf
input {
redis {
host => "192.168.189.118"
port => "6379"
db => "0"
key => "filebeat"
data_type => "list"
}
}
filter {
mutate {
convert => ["upstream_time", "float"]
convert => ["request_time", "float"]
}
}
output {
if "access" in [tags] {
elasticsearch {
hosts => "http://192.168.189.118:9200"
manage_template => false
index => "nginx-redis-access-%{+yyyy.MM}"
}
}
if "error" in [tags] {
elasticsearch {
hosts => "http://192.168.189.118:9200"
manage_template => false
index => "nginx-redis-error-%{+yyyy.MM}"
}
}
}
#### logstash 只需要从redis 里面的 filebeat 这个key 读取数据就可以了。