Elkstack 之 消息解耦 redis

2018年4月9日17:53:02 发表评论 406 views

今天主要是把我们elkstack业务早起设计缺陷的痛点拿出来和大家分享,通过今天的学习,相信我和大家都会收获颇多。

一、redis可以解决什么问题?

  • 服务器内存即将被使用完毕,查看是因为redis服务保存了大量的数据没有被读取而占用了大量的内存空间。
  • logstach服务器异常,filebeat收集的数据丢失
    以上这些问题,都可以使用中间件来巧妙的化解,下面我们就用一台服务器按照部署redis服务,专门用于日志缓存使用,用于web服务器产生大量日志的场景。
    Elkstack 之 消息解耦 redis

二、部署redis

请查看:redis部署与实践

三、filebeat收集单个类型日志并写入redis

Filebeat支持将数据直接写入到redis服务器,本步骤为写入到redis当中的一个可以,另外filebeat还支持写入到elasticsearch、logstash等服务器。

1.filebeat配置

filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/messages
    - /var/log/nginx/*access.log
  exclude_lines: ["^DBG","^$"]
  document_type: system-log-5612

output.redis:
  hosts: ["192.168.56.13:6379"]
  key: "system-log-5612"  #为了后期日志处理,建议自定义key名称
  db: 1  #使用第几个库
  timeout: 5  #超时时间
  password: 123456 #redis密码

2.验证redis是否有数据:

[root@elk-server redis]# redis-cli   #登陆
127.0.0.1:6379> AUTH 123456    #密码
OK
127.0.0.1:6379> SELECT 1  #选择1号库
OK
127.0.0.1:6379[1]> KEYS *  #查看key
1) "system-log-5612"
127.0.0.1:6379[1]> LLEN system-log-5612
(integer) 1738

Elkstack 之 消息解耦 redis

3,查看redis中的日志数据内容

127.0.0.1:6379[1]> RPOP system-log-5612  #查看内容

Elkstack 之 消息解耦 redis

四、logstash从redis提取数据

input {
  redis {
    host => "192.168.56.13"
    port => "6379"
    db => "1"
    password => "123456"
    key => "system-log-5612"
    data_type => "list"
 }
}


output {
    elasticsearch {
      hosts => ["192.168.56.13:9200"]
      index => "system-log-5612"
    }
}

报错:忘记加password,就报错了Logstash could not be started
解决方法:1,删除锁定文件 2,添加password 选项
https://www.jianshu.com/p/1028f77ff16e

查看redis中是否有数据:

Elkstack 之 消息解耦 redis

head插件和Kibana添加索引查看

如果没有创建,查看下logstash日志报错,或者if判断是否写对。
Elkstack 之 消息解耦 redis

五、kibana界面添加索引

Elkstack 之 消息解耦 redis
Elkstack 之 消息解耦 redis

六、监控redis数据长度

实际环境当中,可能会出现reids当中堆积了大量的数据而logstash由于种种原因未能及时提取日志,此时会导致redis服务器的内存被大量使用,甚至出现如下内存即将被使用完毕的情景
Elkstack 之 消息解耦 redis
查看reids中的日志队列长度发现有大量的日志堆积在redis 当中:
Elkstack 之 消息解耦 redis

#!/usr/bin/env python
#coding:utf-8
#URL:www.dgstack.cn
import redis
def redis_conn():
    pool=redis.ConnectionPool(host="192.168.56.13",port=6379,db=1,password=123456)
    conn = redis.Redis(connection_pool=pool)
    data = conn.llen('system-log-5612')
    print(data)
redis_conn()

七、遗留问题,

1,加入redis后 原来kibana中web日志格式是json的,现在不是了,终于解决了。

这个问题今日群里大神给我了指点 【感谢 wwbhl 】
Elkstack 之 消息解耦 redis

filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/nginx/*access.log
  json.keys_under_root: true  ##添加如下2行,结课将json格式覆盖原有key
  json.overwrite_keys: true
  #exclude_lines: ["^DBG","^$"]
  document_type: system-log-5612

output.redis:
  hosts: ["192.168.56.13:6379"]
  key: "system-log-5612"
  db: 1
  timeout: 5
  password: 123456

效果图如下:
Elkstack 之 消息解耦 redis

2,filebeat 支持 json格式日志的时候支持,无法使用 exclude_lines

法1: 取消exclude功能 【如果您想2者兼得,往下看 法2】
https://elasticsearch.cn/question/4432
Elkstack 之 消息解耦 redis

法2:

filebeat.prospectors:
- input_type: log

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
  - /var/log/nginx/*access*.log
  exclude_lines: ["^DBG","^$"]

processors:
  - decode_json_fields:
      fields: ["message"]
      process_array: false
      max_depth: 1
      target: ""
      overwrite_keys: false
  - drop_fields:
      fields: ["message"]

法3:

filebeat.prospectors:
- input_type: log

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
  - /var/log/nginx/*access*.log
  json.keys_under_root: true
  json.overwrite_keys: true

processors:
  - drop_event:
     when:
        regexp:
           message: "^DBG|^abc"

更多精彩:ELKstack相关文章

  • QQ精品交流群
  • weinxin
  • 微信公众号
  • weinxin
admin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: