作者:许涛
1. 为什么要用到日志分析平台
随着业务的发展,服务越来越多,相应地,日志的种类和数量也越来越多。一般地,我们会用grep、awk,或者编写脚本进行日志分析。对于多个服务构成的系统,需要人为把这些日志分析工作有机地结合起来。在业务系统组件多而组件间关联复杂的情况下,这种分析方法效率十分低下,一个日志分析平台极为必要。从日志的整合和展示看,日志分析平台主要由两部分构成,一是日志整合系统,负责把各组件日志集中并索引起来,以方便快速的搜索和分析,这可以用ELK开源软件进行搭建;二是日志分析展示系统,对各类日志提供尽可能多的自动化分析和评估报表,这需要辨识并固化尽可能多的日志分析的行为模式。这些都基于对ELK的认识和对业务系统各组件日志的理解。
2. ELK日志整合系统
一个基本的日志整合系统包括采集、传输、分析装载和存储展示等部分。在ELK日志整合系统中,Filebeat负责采集和传输,Kafka(非必须)负责中转传输,Logstash负责接收、分析、过滤和装载,Elasticsearch负责分析、存储和索引,Kibana负责展示。一个信息流将如下完成端到端的收集过程:
在早期的ELK系统中,常采用Logstash进行日志的采集,但Logstash性能消耗较大,后来就出现了轻量级的Beat模块进行日志或性能数据的采集,这里使用Filebeat进行日志的采集。采用Kafka进行中转传输可以对数据进行缓冲,在一定程度上适配数据采集和分析装载服务的分布式化和它们之间的速度差异,以保护数据不丢失。基于配置文件,Logstash可以进行数据的过滤、改写,并最终装载进Elasticsearch。对于不同的日志文件,用户可以定义数据的mapping,便于Elasticsearch进行分析和索引,最终有利于后续的日志分析。
在这个系统中,可以基于所应对的服务规模对Kafka和Elasticsearch进行集群化的部署,提供高可用、高性能和可伸缩的日志整合系统。
3. ELK日志整合系统的搭建
首先是各组件的安装:
待采集日志的服务器需要安装Filebeat
https://www.elastic.co/downloads/beats/filebeat
中转日志的服务器需要安装kafka和zookeeper(zk用于支持kafka的运行)
https://kafka.apache.org/quickstart
https://zookeeper.apache.org/doc/r3.1.2/zookeeperStarted.html
日志集中平台服务器需要安装Logstash和Elasticsearch
https://www.elastic.co/downloads/logstash
https://www.elastic.co/downloads/elasticsearch
日志展示需要安装Kibana
https://www.elastic.co/downloads/kibana
其次是各组件的配置(以Oracle alert日志的采集、分析为例):
Filebeat用于从日志中抽取事件,然后把一个个事件插入进kafka,配置文件(filebeat2kafka.yml)如下:
- type: log
fields:
log_topic: alert-logs
enabled: true
paths:
- /scratch/u01/app/oracle/diag/asm/+asm/*/trace/alert_*.log
multiline.pattern: '^[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}T[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}'
multiline.negate: true
multiline.match: after
output.kafka:
hosts: ["kafkahost1:9092"," kafkahost2:9092"," kafkahost3:9092"]
topic: '%{[fields.log_topic]}'
partition.round_robin:
reachable_only: false
required_acks: 1
compression: gzip
max_message_bytes: 1000000
version: 2.0.0
这里列出了两个关键配置,一是定义了怎么从alert日志里抽取事件,这个事件往往跨越多行,需要Filebeat的multiline模式支持,二是kafka的topic的定义,用于区分各个不同的日志种类或实例,将来Logstash从kafka中提取数据时应该使用相应的topic。
Logstash从kafka的topic中提取事件,然后分拆事件为字段,最终将事件插入Elasticsearch,配置文件(logstash2kafka.conf)如下:
input {
kafka {
bootstrap_servers => " kafkahost1:9092, kafkahost2:9092, kafkahost3:9092"
codec => "json"
topics => ["alert-logs"]
}
}
filter{
mutate { add_field => { "clienthost" => "%{[beat][hostname]}" } }
mutate { split => ["clienthost", "."] }
mutate { replace => ["clienthost", "%{[clienthost][0]}"] }
grok {
match => {
"[source]" => ".*alert_(?<index>.*)\.log$"
}
}
grok {
match => {
"message" => "%{TIMESTAMP_ISO8601:timestamp}(?<log_message>.*$)"
}
}
date {
match => [ "timestamp", "ISO8601" ]
}
mutate {
lowercase => [ "index" ]
replace => [ "message", "%{log_message}" ]
remove_field => [ "timestamp", "log_message"]
}
if [message] =~ /ORA-/ {
ruby {
code => "mat = event.get('message').scan(/(ORA-[0-9]+)/)
event.set('OERR', mat.flatten)
event.set('CONSEC_OERR', mat.flatten.join(','))"
}
}
}
output {
stdout {
#codec => rubydebug
codec => dots
}
elasticsearch{
index => "oracle-alert-%{clienthost}-%{index}-%{+YYYY}"
}
}
在定义Logstash的配置文件前,需要搞清楚该类日志数据的使用场景,由此得到其在Elasticsearch中存储的schema,这包括index命名规则、事件到字段的映射和字段的类型等。Logstash配置文件主要由三部分构成,其中input部分定义kafka的topic,并使用json进行解析,否则将无法得到Filebeat的部分Field数据。filter部分对原始的alert事件进行解析,因为要得到ORA-错误进行聚集、排序等分析操作,需要提取ORA-错误,这里生成了两个相关字段,一个是OERR,是一个事件中的所有ORA-错误列表,另一个字段是CONSEC_OERR,是用逗号分隔的一个事件中所有ORA-错误。output部分就是把处理后的信息插入Elasticsearch中。
kafka、zookeeper和Elasticsearch的配置较为简单,此处略过。
日志整合系统中的kafka和Elasticsearch在面对多个服务日志分析时,如何监控其性能并做出应对就极为必要,这里推荐两个监控管理软件:
https://github.com/yahoo/kafka-manager
https://github.com/mobz/elasticsearch-head
4. ELK日志分析系统
在Elasticsearch进行日志存储和索引后,用户可以基于Kibana对这些数据进行基本的探索、分析和生成报表。如果这种探索分析简单,Kibana就足够了,如果要探索分析的数据和行为复杂,就需要用户熟练使用Kibana的图形界面和Elasticsearch提供的DSL语言,在Kibana上逐步地进行探索分析。鉴于此,基于Elasticsearch构建自己的日志分析系统就较为必要。这个平台可以基于Kibana进行定制化开发,也可以基于Elasticsearch的API进行开发。
5. 参考文章
https://facingissuesonit.com/2017/05/29/integrate-filebeat-kafka-logstash-elasticsearch-and-kibana/
关于作者
许涛,曾供职过民航信息运行部、中国惠普性能优化团队和Oracle系统架构和性能服务团队,目前在Oracle公司数据库研发部门工作。
本文分享自 云服务与SRE架构师社区 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!