使用filebeat收集不同用应用的日志传输到redis,并加以区分

附加技巧

步骤流程:
使用filebeat收集一台主机上两个不同应用的日志,传递给redis,然后logstash从redis中拉去数据传递给elasticsearch

1.filebeat.yml文件配置

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/openresty/nginx/logs/host.access.log # 假设应用1的日志路径
  fields:
    log_source: messages # logstash判断日志来源

- type: log
  enabled: true
  paths:
    - /usr/local/openresty/nginx/logs/error.log  # 假设应用2的日志路径
  fields:
    log_source: secure
    
# 输出到redis的第一个数据库
# 默认是list形式
output.redis:
  hosts: ["192.168.80.107:6379"]
  key: messages_secure # redis中的键,值是一个列表,俩表中存储的一行一行的上面两个应用的日志,logstash中会用到这个参数
  password: foobar2000 # redis访问密码
  db: 0

2.logstash目录下conf.d/*.conf文件配置

input {
  redis {
    host => "192.168.80.107"
    port => 6379
    password => foobar2000 # redis访问密码
    data_type => "list" # redis存储的值类型
    key => "messages_secure" # redis中的键,跟filebeat.yml配置文件中输出到redis.output一样
    db => 0 # 指定的redis数据库
  }
}

output {
  # 根据redis键 messages_secure 对应的列表值中,每一行数据的其中一个参数来判断日志来源
  if [fields][log_source] == 'messages' {
    elasticsearch {
      hosts => ["http://192.168.80.104:9200", "http://192.168.80.105:9200","http://192.168.80.106:9200"]
      index => "filebeat-message-%{+YYYY.MM.dd}"
      #user => "elastic"
      #password => "elastic123"
    }
  }
  
  if [fields][log_source] == 'secure' {
    elasticsearch {
      hosts => ["http://192.168.80.104:9200", "http://192.168.80.105:9200","http://192.168.80.106:9200"]
      index => "filebeat-secure-%{+YYYY.MM.dd}"
      #user => "elastic"
      #password => "elastic123"
    }
  }
}

如下是redis列表值中的两条不同的数据,删除元数据后的数据
fields字段值是在filebeat.yml中设置的,根据这个值得不同,进而在elasticsearch中创建不同的索引

{
  "fields": {
    "log_source": "secure"
  },

  "log": {
    "offset": 12944,
    "file": {
      "path": "/usr/local/openresty/nginx/logs/error.log"
    }
  },
  "message": "2019/08/28 00:01:47 [error] 6764#6764: *4 open() \"/usr/local/openresty/nginx/html/lua\" failed (2: No such file or directory), client: 192.168.80.1, server: localhost, request: \"GET /lua HTTP/1.1\", host: \"192.168.80.108\"",

}


{
  "log": {
    "offset": 723861,
    "file": {
      "path": "/usr/local/openresty/nginx/logs/host.access.log"
    }
  },
  "message": "192.168.80.1 - - [28/Aug/2019:00:01:47 +0800] \"GET /lua HTTP/1.1\" 404 131 \"-\" \"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0\" \"-\"",
  "fields": {
    "log_source": "messages"
  },
}

研究:若是俩应用的日志想分别输出到redis不同的库,设置不同的redis键,要如何操作?

  1. filebeat.inputs写俩的话,默认最后一个secure的生效才会收集日志,messages的不会生效收集日志,比如下面的写法:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/openresty/nginx/logs/host.access.log # 假设应用1的日志路径
  fields:
    log_source: messages # logstash判断日志来源

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/openresty/nginx/logs/error.log  # 假设应用2的日志路径
  fields:
    log_source: secure

2.output.redis写俩的话默认最后一个的bbb生效,比如下面的这种写法:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/openresty/nginx/logs/host.access.log # 假设应用1的日志路径
  fields:
    log_source: messages # logstash判断日志来源

- type: log
  enabled: true
  paths:
    - /usr/local/openresty/nginx/logs/error.log  # 假设应用2的日志路径
  fields:
    log_source: secure
    
# 输出到redis的第一个数据库
# 默认是list形式
output.redis:
  hosts: ["192.168.80.107:6379"]
  key: messages_secure # redis中的键,值是一个列表,俩表中存储的一行一行的上面两个应用的日志,logstash中会用到这个参数
  password: foobar2000 # redis访问密码
  db: 0

output.redis:
  hosts: ["192.168.80.107:6379"]
  key: bbb # redis中的键,值是一个列表,俩表中存储的一行一行的上面两个应用的日志,logstash中会用到这个参数
  password: foobar2000 # redis访问密码
  db: 1
  1. 若是如下这种写法,均只有最后一个生效,也就是只会收集secure的日志,并传输到redis的bbb这个里
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/openresty/nginx/logs/host.access.log
  fields:
    log_source: messages 
    
output.redis:
  hosts: ["192.168.80.107:6379"]
  key: aaa
  password: foobar2000
  db: 0

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/openresty/nginx/logs/error.log
  fields:
    log_source: secure

output.redis:
  hosts: ["192.168.80.107:6379"]
  key: bbb
  password: foobar2000
  db: 0

所以这个问题还有待研究,或者使用不同的inputs来源,或者使用不同的output输出

查看集群主从分配

http://192.168.80.104:9200/_cat/nodes?v

查看集群状态

http://192.168.80.104:9200/_cluster/health?pretty

小技巧,查看filebeat获取的日志结果

可以把filebeat收集的日志传输到redis中,在redis中查看,若日志正确无误,然后再开启logstash从redis中拉取数据

posted @ 2019-08-28 09:02  哈喽哈喽111111  阅读(2908)  评论(0编辑  收藏  举报