zoukankan      html  css  js  c++  java
  • 使用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中拉取数据

  • 相关阅读:
    数学之路-python计算实战(1)-ubuntu安装pypy
    myeclipse中Servlet出错
    从IBM的计划中分析出中国重新相当然的错误选择吗
    辛星浅谈mysql中的数据碎片以及引擎为MyISAM下的操作
    微信前端js sdk以外的开发
    Hadoop生态系统学习路线
    还原对于server失败 备份集中的数据库备份与现有数据库不同
    hdu 4549 M斐波那契数列(矩阵高速幂,高速幂降幂)
    POJ 题目3667 Hotel(线段树,区间更新查询,求连续区间)
    阿里上市:盘点马云这些年
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/11421962.html
Copyright © 2011-2022 走看看