ELK 日志分析系统

本篇介绍开源分布式日志系统 ELK(Elasticsearch + Logstash + Kibana)及 EFK(Elasticsearch + Filebeat + Kibana)的搭建与使用,涵盖 Elasticsearch 集群配置、Kibana 安装、Logstash 收集系统日志、Filebeat 轻量采集,以及 Kibana 索引配置和常用索引操作。实验使用三台虚拟机模拟。

一、ELK 概述

常见的开源分布式日志系统:

  • ELK:Elasticsearch + Logstash + Kibana
  • EFK:Elasticsearch + Filebeat + Kibana

各组件作用:

组件 作用
Elasticsearch 开源分布式搜索引擎,提供搜集、分析、存储数据三大功能,www.elastic.co
Logstash 日志的搜集、分析、过滤工具
Kibana 为 Logstash 和 Elasticsearch 提供友好的 Web 界面,用于汇总、分析和搜索日志
Beats 新版本加入的轻量级日志收集处理工具(Agent),占用资源少

架构示意

                      kibana(日志 Web 展示)
                         |
                         |
        elasticsearch1   elasticsearch2   elasticsearch3(集群,日志分析存储)
                         |
                         |
                      logstash(收集或过滤日志)
                         |
        ------------------------------------------------
        |            |            |            |
     业务服务器1   业务服务器2   业务服务器3   业务服务器4
       beats        beats        beats        beats

Filebeat 收集日志后可传给 Elasticsearch,也可传给 Logstash 过滤。


二、实验环境准备

使用三台虚拟机模拟:

IP 角色
192.168.224.10 kibana + elasticsearch 主节点
192.168.224.11 elasticsearch 数据节点 1 + logstash 或 filebeats
192.168.224.12 elasticsearch 数据节点 2 + logstash 或 filebeats

环境要求:内存 2G 以上,CPU 单核以上。

2.1 主机名及绑定

vim /etc/hosts
192.168.224.10  server.example.com  server
192.168.224.11  client1.example.com client1
192.168.224.12  client2.example.com client2

2.2 其他准备

  1. 时间同步。
  2. 静态 IP 绑定。
  3. 关闭防火墙、SELinux。
  4. 配置 YUM 源(本地源加下面的 ELK 源)。

公网源路径(RPM 包较大,网速不建议):

[elk]
name=elk
baseurl=https://artifacts.elastic.co/packages/6.x/yum
enabled=1
gpgcheck=0

内部共享源:

[elk]
name=elk
baseurl=http://192.168.2.254/elk-yum/
enabled=1
gpgcheck=0

三、搭建 Elasticsearch 集群

3.1 安装 JDK 和 Elasticsearch

三台机器确认有 JDK:

java -version
openjdk version "1.8.0_102"
OpenJDK Runtime Environment (build 1.8.0_102-b14)
OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)

三台均安装 Elasticsearch:

yum install elasticsearch -y

3.2 配置 Elasticsearch

主节点(vm1 / 192.168.224.10)

vim /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-cluster                              # 集群名
node.name: server.com                                  # 本节点主机名
node.master: true                                      # 定义此节点为 master 节点
node.data: false                                       # 定义此节点不为数据节点
path.data: /var/lib/elasticsearch                      # 数据目录
path.logs: /var/log/elasticsearch                      # 日志目录
network.host: 0.0.0.0                                  # 监听地址
http.port: 9200                                        # 监听端口
discovery.zen.ping.unicast.hosts: ["192.168.224.10", "192.168.224.11", "192.168.224.12"]

数据节点 1(vm2 / 192.168.224.11)

cluster.name: elk-cluster
node.name: client1.example.com
node.master: false                                     # 非 master 节点
node.data: true                                        # 数据节点
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.224.10", "192.168.224.11", "192.168.224.12"]

数据节点 2(vm3 / 192.168.224.12)

cluster.name: elk-cluster
node.name: client2.example.com
node.master: false
node.data: true
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.224.10", "192.168.224.11", "192.168.224.12"]

三台均启动并设置开机自启:

systemctl start elasticsearch
systemctl enable elasticsearch

3.3 查看端口

netstat -ntlup | grep java
tcp6       0      0 :::9200     :::*     LISTEN      49295/java
tcp6       0      0 :::9300     :::*     LISTEN      49295/java
  • 9200:数据传输端口。
  • 9300:集群通信端口。

3.4 启动失败排查

若启动不了,检查系统最大打开文件数:

ulimit -n
1024

若过小,编辑 /etc/security/limits.conf,在文件尾部添加:

* soft nofile 10240
* hard nofile 10240

重启系统生效。

3.5 检查集群健康状态

通过浏览器或 curl 访问主节点:

curl http://192.168.224.10:9200/_cluster/health?pretty
{
  "cluster_name" : "elk-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

关键字段:

字段 说明
status 集群状态,green 为正常
number_of_nodes 节点总数
number_of_data_nodes 数据节点数

查看集群详细信息:

curl http://192.168.224.10:9200/_cluster/state?pretty

四、安装配置 Kibana

在主节点(192.168.224.10)上安装:

yum install kibana

编辑 /etc/kibana/kibana.yml:

server.port: 5601                                          # kibana 监听端口
server.host: 192.168.224.10                                # 监听 IP
elasticsearch.url: "http://192.168.224.10:9200"            # elasticsearch master 地址
logging.dest: /var/log/kibana.log                          # 日志文件路径,方便排错

准备日志文件并启动:

touch /var/log/kibana.log
chown kibana.kibana /var/log/kibana.log
systemctl restart kibana
systemctl enable kibana
lsof -i:5601

浏览器访问:

http://192.168.224.10:5601

五、ELK:Logstash 收集系统日志

5.1 安装 Logstash

在 node1(192.168.224.11)上安装:

yum install logstash -y

5.2 配置 Rsyslog 转发

编辑 /etc/rsyslog.conf,在文件末尾添加:

*.*  @@192.168.224.11:10514

重启 rsyslog:

systemctl restart rsyslog

5.3 配置 Logstash

查看配置:

grep -Ev "^#|^$" /etc/logstash/logstash.yml
path.data: /var/lib/logstash
http.host: "192.168.224.11"
path.logs: /var/log/logstash

创建收集配置文件 /etc/logstash/conf.d/syslog.conf:

input {
  syslog {
    type => "system-syslog"
    port => 10514                      # 与 rsyslog 配置的端口对应
  }
}
output {
  elasticsearch {
    hosts => ["192.168.224.10:9200"]  # elasticsearch 集群 master 节点
    index => "system-syslog-%{+YYYY.MM}"   # 定义日志索引
  }
}

5.4 启动 Logstash

cd /usr/share/logstash/bin
./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf &

启动等待较久(虚拟机环境约 2-3 分钟),期间屏幕会陆续输出。

netstat -ntlup | grep 9600
netstat -ntlup | grep 10514

5.5 测试并配置 Kibana 索引

在 Kibana 服务器(192.168.224.10)查看索引:

curl '192.168.224.10:9200/_cat/indices?v'
health status index                 uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   system-syslog-2018.11 tTNC6tV_RoqYSHLtlCAG-A   5   1          3            0     58.8kb         29.4kb

浏览器访问 http://192.168.224.10:5601:

  1. Management → Index Patterns。
  2. 在 Index pattern 填写索引名称(system-syslog-2018.11 或 system-syslog-*)→ Next step。
  3. Time Filter field name 下拉选择 @timestamp → Create Index Patterns。
  4. 点击 Discover 查看。

六、EFK:Filebeat 轻量采集

6.1 安装 Filebeat

在 node1 和 node2 上都安装:

yum install filebeat -y

6.2 修改配置

两台机器都编辑 /etc/filebeat/filebeat.yml:

filebeat.inputs:

- type: log

  # enabled: false        # 注释这一句
  paths:
    - /var/log/yum.log    # 改成要测试的日志,也可写成 /var/log/*.log

output.elasticsearch:
  hosts: ["192.168.224.10:9200"]   # 输出给 elasticsearch master

6.3 启动服务

两台均执行:

systemctl start filebeat
systemctl enable filebeat
systemctl status filebeat

6.4 确认索引

回到 Kibana 服务器:

curl '192.168.224.10:9200/_cat/indices?v'
health status index                     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .kibana                   nab-SyHRQSG-XG4zxOG2OA   1   1          2            0     46.8kb         23.4kb
green  open   filebeat-6.3.0-2018.11.25 FUDik0pdTNOeatjA6iH-Aw   3   1         30            0    228.4kb        107.9kb

6.5 Kibana 图形界面配置

浏览器访问 http://192.168.224.10:5601(原文中写为 5061,应为 5601):

  1. Management → Index Patterns。
  2. Index pattern 填写 filebeat-6.3.0-2018.07.05 或 filebeat-*。
  3. Next step → Time Filter field name 选择 @timestamp → Create Index Patterns。
  4. 点击 Discover 查看。若没有日志输出,可向 yum.log 中追加新日志。

6.6 多日志文件配置示例

grep -Ev "#|^$" /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  paths:
    - /var/log/yum.log
- type: log
  paths:
    - /var/log/nginx/access.log
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 3
setup.kibana:
output.elasticsearch:
  hosts: ["192.168.224.10:9200"]
  index: "yum-nginx-%{+yyyy.MM.dd}"
setup.template.name: "yum-nginx"
setup.template.pattern: "yum-nginx-*"

七、索引常用操作

删除索引:

curl -XDELETE '192.168.224.10:9200/.kibana'

GET 索引:

curl -XGET '192.168.224.10:9200/yum-nginx-2018.07.06'

更多功能请自行查阅资料。

最后修改:2026 年 09 月 20 日
如果觉得我的文章对你有用,请随意赞赏