• 最常见的日志收集架构(ELK Stack)


    日志存在于不同的机器不同的目录,所以首先机器上面要有收集日志的 Agent,这些 Agent 被生动的叫做:Shippers(直译:发货商),好理解,将日志像货物一样发送出去。

     

    我第一次听到 ELK 的时候,以为它就是 Elasticsearch 的缩写,谁知道它代表了三个组件:

    • E - Elasticsearch(简称:ES)
    • L - Logstash
    • K - Kibana

    我理解也不是很深刻,Logstash 主要用来收集各个 Shipper 发过来的日志,并做一个过滤,然后发给 Elasticsearch 保存,Elasticsearch 保存日志,建索引,然后提供接口,Kibana 作为前端调接口提供可配置的可视化。

    这就是从机器上的日志,到可视化一个过程,蛮清晰的。

    日志数据可以这样:

    Filebeat(Shipper) -> Elasticsearch

    索引(动词)之前如果要做过滤拆分字段就加个 Logstash:

    Filebeat(Shipper) -> Logstash -> Elasticsearch

    如果 Agent 量比较大,中间再加一个消息队列:

    Filebeat(Shipper) -> 消息队列 -> Logstash -> Elasticsearch

    这一套搭建下来很容易,遇到的问题我列一下,希望对你也有帮助:

    问:如何保证 ES 中的数据有序?

    答:Logstash 的 filter 流程中的 date 插件可以解析业务时间并替换 @timestamp 字段,ES 默认是按照 @timestamp字段排序的。

    filter {
      if [beat][name] == "xxx-backend" {
        grok {
          match => { "message" => "%{GREEDYDATA:time} [%{DATA:log_level}] [%{DATA:golang}] %{GREEDYDATA:message}" }
          overwrite => [ "message" ]
        }
        date {
          match => ["time", "yyyy/MM/dd HH:mm:ss.SSS"]
        }
      }
    }

    判断是不是某个业务,如果是,那我们知道格式,然后使用 grok 插件,解析并拆分字段,其中的 time 字段给 date 插件解析并替换 @timestamp 。


     

    问:Kafka 中的数据格式是什么样的,如何消费?

    答:Filebeat 打到 kafka 的日志信息是 json 格式的,Logstash 消费的时候可以使用 filter 流程中的 json 插件来解析。

    filter {
      if [type] == 'from-kafka' {
        json {
          source => "message"
        }
      }
    }

    问:如何区分不同的数据来源?

    答:input 块中,type 字段标明即可。

    input {
      beats {
        port => 5044
        type => "from-beat"
      }
      kafka {
        bootstrap_servers => "kafkahost1:9092,kafkahost2:9092,kafkahost3:9092"
        topics => ["pdd"]
        type => "from-kafka"
      }
    }

    问:如何标记不同的业务日志?

    答:使用 Shipper 的 name 或者 tag 来标记。

    name: xxx-backend
    filebeat.inputs:
    - type: log
      enabled: true
      paths:
        - /data/xxx-logs/*.log
      tags: ["正义之剑"]

    问:如何在 ES 中为不同的业务创建不同的 index?

    答:上面我们为 Shipper 起了名字,我们可以用名字作为索引的一部分。

    output {
      elasticsearch {
        hosts => "http://EShost:9200"
        index => "xxx-%{[beat][name]}-%{+YYYY.MM.dd}"
        user => "xxx"
        password => "yyy"
      }
    }

    问:如何在 Logstash 层配置多个业务的 filter?

    答:和 nginx 的配置类似,有个 conf.d 的文件夹,配置都放在下面,然后开启自动 reload 即可。

    • 在 logstash.yml 配置文件中启用:
    config.reload.automatic: true
    config.reload.interval: 10s
    • 观察 pipelines.yml 中配置:
    - pipeline.id: main
      path.config: "/etc/logstash/conf.d/*.conf"

    只启用一个管道,配置 watch path.config 目录 。

     

  • 相关阅读:
    四组API
    常用的辅助类(必会
    时间戳
    SpringMVC JSON乱码解决
    数据显示到前端
    ubuntu vim字体高亮
    vi编辑文件保存后,提示""vimrc" E212: Can't open file for writing Press ENTER or type command to continu"
    C语言程序设计100例之(25):确定进制
    C语言程序设计100例之(24):数制转换
    C语言程序设计100例之(23):数列求和
  • 原文地址:https://www.cnblogs.com/yszr/p/14306649.html
Copyright © 2020-2023  润新知