摘要:为加入替换下这是的第二篇文章编译安装日志分析平台支持多种输入输出方法本文章主要描述通过做队列中间件缓解平台的压力使用场景数据不可控时例如日志不是文件而是由直接推送到的就无法使用了当然是可以和一起使用的例如读取文件解析后输出到再由正常流程处理
为elk加入redis, 替换下beats
这是elk的第二篇文章
编译安装日志分析平台 elk + filebeat
elk支持多种输入输出方法 ,本文章主要描述通过redis做队列中间件 ,缓解elk平台的压力使用场景
数据不可控时 ,例如日志不是文件 , 而是由TCP直接推送到elk的 ,filebeats就无法使用了优势当然redis是可以和beats一起使用的, 例如beats读取文件解析后输出到redis ,再由elk正常流程处理, 具体的这里不做讨论
在通过logstash之前走redis , 分散压力不至于logstash负载太高 ,处理缓慢甚至宕机流程图 elk
请看第一篇文章 : 编译安装日志分析平台 elk + filebeatredis 什么是redis
Redis是一个支持多种数据结构的开源(BSD许可)内存型数据库 , 除此之外它甚至可以被用作持久化数据库,缓存器和消息队列 查看更多如何安装redis
极其简单 ,使用yum或下载源码make即可 , 不再赘述
yum安装
yum -y install redis
源码安装
cd /opt wget http://download.redis.io/releases/redis-4.0.11.tar.gz || curl -O http://download.redis.io/releases/redis-4.0.11.tar.gz tar xzvf redis-4.0.11.tar.gz && cd redis-4.0.11 && yum -y install gcc && make配置redis
可以不配置 ,但是笔者需要从外部链接redis ,所以把监听地址修改为局域网IP
大家按需执行即可
配置文件位置:
yum : /etc/redis.conf
源码 : /opt/redis-4.0.11/redis.conf
# 修改监听地址 sed -i "s/^bind 127.0.0.1/bind 192.168.1.147/" /opt/redis-4.0.11/redis.conf # 修改监听端口 sed -i "s/^port 6379/port 6379/" /opt/redis-4.0.11/redis.conf启动redis
这里也分两种
yum安装启动方法
systemctl redis start
源码安装启动方法
/opt/redis-4.0.11/src/redis-server /opt/redis-4.0.11/redis.conf &启动完成就像这样 , 然后回车即可 配置elk
和第一篇中为elk加入beats一样 , 只需要编辑logstash的配置文件就可以了
修改logstash的输入输出配置为了避免你已经手动修改了配置文件 , 我们不再使用sed为改为手动修改配置文件
使用你喜爱的编辑器打开 /opt/logstash-6.3.2/config/logstash-io.conf
在input代码块中增加如下内容并保存
redis { key => "redis_log" data_type => "list" type => "redis" host => "192.168.1.147" port => "6379" threads => 12 # 如果存进redis的数据是json才需要这一行 codec => "json" }
在input代码块的同级增加如下内容并保存
这里是处理nginx日志的过滤器 , 稍候会讲里面的grok语法
filter { if [type] == "redis" { grok { match => { "message" => "%{IPORHOST:remote_ip} - - [%{HTTPDATE:datetime}] "(:?%{WORD:request_method} %{NOTSPACE:uri}) (:?HTTP/%{NUMBER:http_version})" (:?%{NUMBER:http_code}) (:?%{NUMBER:contents_length}) "(:?%{NOTSPACE:domail})" "(:?%{DATA:ua}) ((:?%{DATA:os})%{NUMBER:os_version}) %{DATA}) %{DATA:browser}/%{DATA:browser_version} (:?%{DATA:safari_version})"" } } geoip { source => "client_ip" } date { match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ] } } }
修改output代码为如下这样
这为了按类型划分索引
output { if [type] == "redis" { elasticsearch { hosts => ["192.168.1.147:9200"] manage_template => false index => "redis-%{+YYYY.MM.dd}" } } else if [type] == "beats" { elasticsearch { hosts => ["192.168.1.147:9200"] manage_template => false index => "beats-%{+YYYY.MM.dd}" } } else { elasticsearch { hosts => ["192.168.1.147:9200"] manage_template => false index => "unkown-%{+YYYY.MM.dd}" } } }
最终配置文件大概会是这个样子
input { beats { port => 5044 type => "beats" } redis { key => "redis_log" data_type => "list" type => "redis" host => "192.168.1.147" port => "6379" threads => 12 codec => "json" } } filter { if [type] == "redis" { grok { match => { "message" => "%{IPORHOST:remote_ip} - - [%{HTTPDATE:datetime}] "(:?%{WORD:request_method} %{NOTSPACE:uri}) (:?HTTP/%{NUMBER:http_version})" (:?%{NUMBER:http_code}) (:?%{NUMBER:contents_length}) "(:?%{NOTSPACE:domail})" "(:?%{DATA:ua}) ((:?%{DATA:os})%{NUMBER:os_version}) %{DATA}) %{DATA:browser}/%{DATA:browser_version} (:?%{DATA:safari_version})"" } } geoip { source => "client_ip" } date { match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ] } } } output { if [type] == "redis" { elasticsearch { hosts => ["192.168.1.147:9200"] manage_template => false index => "redis-%{+YYYY.MM.dd}" } } else if [type] == "beats" { elasticsearch { hosts => ["192.168.1.147:9200"] manage_template => false index => "beats-%{+YYYY.MM.dd}" } } else { elasticsearch { hosts => ["192.168.1.147:9200"] manage_template => false index => "unkown-%{+YYYY.MM.dd}" } } }
然后和第一篇一样 , 使用screen启动elk
screen -S elk /opt/elasticsearch-6.3.2/bin/elasticsearch & /opt/logstash-6.3.2/bin/logstash -f /opt/logstash-6.3.2/config/logstash-io.conf & /opt/kibana-6.3.2-linux-x86_64/bin/kibana & # 本次不切换回去了 # Ctrl A + c
如果配置没有问题的话, 最后会输出12行 [logstash.inputs.redis ] Registering Redis... 这样的句子
会输出12行因为我们在input部分指定了threads为12
然后我们再看一看熟悉的kibana , 并且做一些事情
如果启动完成但是看不到kibana ,就回到root关闭防火墙 systemctl stop firewalld测试elk + redis
任何语言的redis客户端都可以向redis推送数据
测试逻辑
链接到redis后, 向redis_log这个list结构循环推送下面的日志内容
127.0.0.1 - - [21/Aug/2018:06:00:32 +0800] "GET /api/index/game-type HTTP/1.0" 200 269 "http://yooooooooo.com/" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"
以php的predis客户端为例向redis推送数据
predis下载地址
lpush("redis_log" ,"127.0.0.1 - - [21/Aug/2018:06:00:32 +0800] "GET /api/index/game-type HTTP/1.0" 200 269 "http://yooooooooo.com/" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36""); echo "$value "; } // 推送完成休息一秒 sleep(1); }
运行这个php例子
php ./pushToRedis.php
假设链接没有问题 , 你会在elk那个终端里看到输出 , 我这里因为配置了json却输入的字符串 , 才会输出的全是错误
在kibana建立redis索引来到 management 部分
一路下一步 ,创建完成
回到首页(一定到确保左上角是redis... 如果不是就点名字旁边的按钮来切换到redis) ,然后打开自动刷新 , 数据就会源源不断的渲染到页面上了
并且我们发现 , 左侧是筛选条件和右侧的数据都多了很多字段 , 这就是修改配置文件时 ,加入的filter段的功劳
大功告成文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/34283.html
摘要:为加入替换下这是的第二篇文章编译安装日志分析平台支持多种输入输出方法本文章主要描述通过做队列中间件缓解平台的压力使用场景数据不可控时例如日志不是文件而是由直接推送到的就无法使用了当然是可以和一起使用的例如读取文件解析后输出到再由正常流程处理 为elk加入redis, 替换下beats 这是elk的第二篇文章 编译安装日志分析平台 elk + filebeat elk支持多种输入输出方法...
摘要:为加入替换下这是的第二篇文章编译安装日志分析平台支持多种输入输出方法本文章主要描述通过做队列中间件缓解平台的压力使用场景数据不可控时例如日志不是文件而是由直接推送到的就无法使用了当然是可以和一起使用的例如读取文件解析后输出到再由正常流程处理 为elk加入redis, 替换下beats 这是elk的第二篇文章 编译安装日志分析平台 elk + filebeat elk支持多种输入输出方法...
摘要:踩过的坑国内好多早期的应用系统都是采用中文编码,现在估计也是一大坨,这会导致应用程序的在写日期时,使用中文格式,例如,本次遇到的一月,内部以统一使用编码,且不支持中文字符转时间类型。 网上有很多的ELK搭建教程,但大多数文章介绍的ELK版本比较旧,内容也比较零散。本文基于最新版本的elastic日志集中分析套件,以及redis作为缓冲,完整记录一套ELK架构搭建过程。并实现了对生产环境...
摘要:踩过的坑国内好多早期的应用系统都是采用中文编码,现在估计也是一大坨,这会导致应用程序的在写日期时,使用中文格式,例如,本次遇到的一月,内部以统一使用编码,且不支持中文字符转时间类型。 网上有很多的ELK搭建教程,但大多数文章介绍的ELK版本比较旧,内容也比较零散。本文基于最新版本的elastic日志集中分析套件,以及redis作为缓冲,完整记录一套ELK架构搭建过程。并实现了对生产环境...
阅读 1956·2021-11-25 09:43
阅读 1909·2021-11-24 09:39
阅读 1328·2021-11-22 12:02
阅读 2785·2021-11-17 09:33
阅读 3013·2021-11-15 11:38
阅读 2332·2021-10-13 09:40
阅读 804·2021-09-22 15:41
阅读 2401·2021-09-06 15:01