ELK中logstash收集日志写入redis

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里面确认下

{58520002-31EC-4024-B768-5231874B0D03}_20191029164431.jpg

可以看到创建了nginx_log的key,但是没有数据,是被ES取走了,我们取kibana上面看下有没有最新的日志数据

{AEA3F432-7AEE-41E4-880D-3CF04AFD51BB}_20191029164548.jpg

看到新日志持续输入到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相当于发布订阅某组频道。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/739.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。