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/

elk_architecture1.png

Figure 1: ELK Architecture (Basic)

elk_architecture2.png

Figure 2: ELK Architecture

1.2. 安装 ELK

每个组件单独安装比较麻烦,下面介绍 docker 方式安装:

$ docker pull sebp/elk

参考:https://elk-docker.readthedocs.io/

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

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"

Author: cig01

Created: <2018-12-01 Sat>

Last updated: <2019-04-21 Sun>

Creator: Emacs 27.1 (Org mode 9.4)