ELK Stack (Log Management Platform)
Table of Contents
1. ELK 简介
ELK 是“Elasticsearch, Logstash, and Kibana”的缩写,它是一个实时日志分析平台。
1.1. ELK 架构
Logstash 负责采集接收日志,经过处理(如过滤等)后发送给 Elasticsearch;Elasticsearch 负责对日志建立索引;Kibana 负责对 Elasticsearch 中的数据进行展示,它提供了一个漂亮的前端 UI。尽管 Logstash 可以直接采集日志,但它跑在 JVM 上面,资源消耗比较大,一般生产机上不部署它,而是使用更轻量的 Filebeat 来采集日志。
ELK 的架构如图 1 所示;如果日志比较多,或者担心 Logstash 异常退出时导致日志丢失,一般还会在 Filebeat 和 Logstash 中间会加个消息队列做缓存,如图 2 所示,这两个图片摘自:https://logz.io/learn/complete-guide-elk-stack/
Figure 1: ELK Architecture (Basic)
Figure 2: ELK Architecture
1.2. 安装 ELK
1.2.1. 启动 ELK
准备一个 docker-compose.yml 文件,内容如下:
version: '3' services: elk: image: sebp/elk volumes: # 为了避免删除container时ES索引数据丢失,映射索引目录到container中 - /home/ec2-user/elk/es_data:/var/lib/elasticsearch # 在sebp/elk容器中,logstash的默认配置文件启用了tls,为方便调试先关闭tls - /home/ec2-user/elk/02-beats-input.conf:/etc/logstash/conf.d/02-beats-input.conf ports: - "5601:5601" # Kibana web interface - "9200:9200" # Elasticsearch JSON interface - "5044:5044" # Logstash Beats interface
容器中“/etc/logstash/conf.d/02-beats-input.conf”的内容为(为调试方便后面用主机中文件覆盖它):
# 下面是容器里执行的命令 $ cat /etc/logstash/conf.d/02-beats-input.conf input { beats { port => 5044 ssl => true ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt" ssl_key => "/etc/pki/tls/private/logstash-forwarder.key" } }
主机中“/home/ec2-user/elk/02-beats-input.conf”的内容为(关闭了 tls):
# 下面是虚拟机中执行的命令 $ cat /home/ec2-user/elk/02-beats-input.conf input { beats { port => 5044 } }
执行 docker-compose up
即可启动 elk。用浏览器打开“your_vm_ip:5601”即可看到 Kibana 界面。
2. Filebeat
2.1. 安装 Filebeat
下面介绍在 Redhat 中安装 filebeat 的步骤。
首先,准备好 Beats repository:
$ sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
创建文件“/etc/yum.repos.d/elastic.repo”,内容如下:
[elastic-6.x] name=Elastic repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
然后,安装 filebeat:
$ sudo yum install filebeat
启动/停止 filebeat:
$ systemctl start filebeat $ systemctl stop filebeat
参考:
https://www.elastic.co/guide/en/beats/filebeat/current/setup-repositories.html
3. Logstash
参考:
Logstash 最佳实践:
https://doc.yonyoucloud.com/doc/logstash-best-practice-cn/get_start/introduction.html
How Logstash Works:
https://www.elastic.co/guide/en/logstash/current/pipeline.html
4. 实例:收集两个应用程序 Log
下面介绍一下如何把生产机上两个应用程序产生的 log 发送给 logstash,假设 ELK 环境是采用前面介绍的 docker 方式安装的。
首先在生产机上安装 filebeat,然后打开其配置文件“/etc/filebeat/filebeat.yml”,配置下面关键信息:
filebeat.inputs: - type: log enabled: true paths: - /home/ec2-user/log/app1-*.log # 假设这是应用程序1产生的log位置 fields: type: "prod-app1" - type: log enabled: true paths: - /home/ec2-user/log/app2-*.log # 假设这是应用程序2产生的log位置 fields: type: "prod-app2" output.logstash: hosts: ["your_logstash_ip:5044"] # 请修改为logstash服务器地址
重启 filebeat 服务:
$ systemctl restart filebeat
在 ELK 中,logstash 组件的配置文件(输入部分)如下:
$ cat /home/ec2-user/elk/02-beats-input.conf input { beats { port => 5044 } }
logstash 组件的配置文件(输出部分)如下:
$ cat /etc/logstash/conf.d/30-output.conf output { elasticsearch { hosts => ["localhost"] manage_template => false index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" document_type => "%{[@metadata][type]}" } }
这时,打开 Kibana 的 Web 页面,在左侧导航栏中选择 Logs 部分,可以看到生产机上两个应用产生的日志。
如果我们只想查看某个应用的日志,则可以在搜索栏中指定(注:下面的双引号不能省略):
fields.type: "prod-app1" fields.type: "prod-app2"