常见的日志收集架构(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"]
}
}
}
相关文章