ELK中我们通常是使用logstash收集到日志然后直接提交到ES中进行存储,当在大量日志的场景下,当存储已经跟不上收集的速度是我们需要使用队列来进行顺序存储,redis在项目中作为存储中间件,下面我们就在之前的笔记的基础上进行一些修改,以便支持redis存取日志信息
之前的logstash配置可以查看https://sulao.cn/post/736.html,我们来看看如何使用redis存取吧
首先我们需要安装redis,这里不赘述redis的安装
修改/etc/logstash/conf.d/logstash.conf
input { beats { port => 5044 codec => plain { charset => "UTF-8" } } } filter { grok { match => ["message", '%{IP:Client} - - \[%{HTTPDATE:timestamp}\] \"(%{WORD:method} %{NOTSPACE:request} HTTP/%{NUMBER:httpversion})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent}'] } if "beats_input_codec_plain_applied" in [tags] { mutate { remove_tag => ["beats_input_codec_plain_applied"] } } } #output { # elasticsearch { # hosts => "172.26.61.61:9200" # manage_template => false # index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" # } #} output { redis { data_type => "list" #工作方式 host => "172.26.61.58" port => "6379" db => "0" #password => "123456" key => "nginx_log" } }
将之前直接输出到ES的配置直接注释掉,然后添加到redis的输出配置,然后测试配置
logstash -f /etc/logstash/conf.d/logstash.conf -t
返回结果如下
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console [WARN ] 2019-10-29 16:30:54.152 [LogStash::Runner] multilocal - Ignoring the 'pipelines.yml' file because modules or command line options are specified [INFO ] 2019-10-29 16:30:56.037 [LogStash::Runner] Reflections - Reflections took 55 ms to scan 1 urls, producing 20 keys and 40 values Configuration OK
接着我们新增一个配置
vi /etc/logstash/conf.d/redis.conf
配置如下
input { redis { data_type => "list" #工作方式 host => "172.26.61.58" port => "6379" db => "0" #password => "123456" key => "nginx_log" threads => 1 } } output { elasticsearch { hosts => "172.26.61.61:9200" manage_template => false index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" } }
然后我们可以去redis和kibana里面确认下
可以看到创建了nginx_log的key,但是没有数据,是被ES取走了,我们取kibana上面看下有没有最新的日志数据
看到新日志持续输入到ES中,kibana可以看到最新的数据那就是没有问题了。
相关redis的参数说明
db:Redis里面有数据库的概念,一般是16个,默认登录后是0,可以通过命令选择。如果应用系统选择使用了不同的数据库,那么可以通过配置这个参数从指定的数据库中读取信息。
key:Redis中的数据都是通过键值来索引的,不管是字符串还是列表,所以这个key相当于数据库中的表。
如果是list或者channel模式,key都是指定的键值;而如果是pattern_channel,那么key可以通过glob通配的方式来指定。
password:有的Redis为了安全,是需要进行验证的。只有设置了password,才能正确的读取信息。相反,如果redis没有设置密码,而logstash中配置了密码,也会报错!
batch_count:这个属性设置了服务器端返回的事件数目,比如设置了5条,那么每次请求最多会直接获取5条日志返回。
data_type logstash工作的类型,logstash中的redis插件,指定了三种方式来读取redis队列中的信息。
list=>BLPOP channel=>SUBSCRIBE pattern_channel=>PSUBSCRIBE
其中list,相当于队列;channel相当于发布订阅的某个特定的频道;pattern_channel相当于发布订阅某组频道。