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

2020-05-29 00:00:00 字段 业务 配置 日志 希望

日志存在于不同的机器不同的目录,所以首先机器上面要有收集日志的 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"]
    }
  }
}

相关文章