当日志的数量非常多的时候,可能需要引入缓存层作为临时存储数据的地方,防止因为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 读取数据就可以了。
实验环境:
192.168.189.118----->elk01 nginx filebeat redis logstash es
redis logstash 也可以分开安装在不同的服务器
filebeat 安装参照前面文档
nginx 直接yum 安装,把nginx 日志,转成json格式。
ES查看数据:
Redis查看数据:
++++++++++++
修改logstash 下面的redis.conf 文件,加入判断。
vim /etc/logstash/conf.d/redis.conf
input {