ELK 学习笔记

1. 什么是 ELK

1.1 日志系统背景和设计

在运维环境中,每个系统都有日志,当系统出现问题时,需要通过查看日志辅助解决问题。当系统规模较小时,可以直接登录服务器查看日志;但在大规模环境中,逐台登录已不现实

想要解决这一问题,可以通过某种方式,将每个系统上的日志进行实时收集,统一的存储到某个日志系统当中,再对这些日志建立索引,通过搜索即可以找到对应日志,并搭配 web 界面提高查询效率。这也是现代日志系统(如 ELK)的核心设计理念

1.2 ELK

ELK 是一个流行的开源日志管理和分析平台,它由三个核心组件组成:ElasticsearchLogstashKibana,也是其名字 ELK 的由来

这三个组件协同工作,使用户能够收集、存储、搜索、分析和可视化大量日志数据。ELK 被广泛用于实时日志分析、应用性能监控、安全事件检测等领域。

  • Elasticsearch 是一个开源分布式搜索和分析引擎。它用于存储和索引大量的数据,使用户能够快速进行全文搜索、分析和聚合。Elasticsearch 的强大之处在于其分布式性能和可扩展性,它能够处理海量数据并提供高效的查询和分析
  • Logstash 是一个用于收集、处理和转发各种类型数据的数据流处理引擎。它可以从多种来源(如日志文件、消息队列、数据库等)收集数据,经过处理后将数据发送到目标存储(如 Elasticsearch)。Logstash 可以用于数据清洗、转换、标准化等,以便将数据准备好供后续的搜索和分析
  • Kibana 是一个用于数据可视化和分析的开源工具。它提供了一个用户友好的 Web 界面,使用户能够创建仪表板、图表和地图来展示 Elasticsearch 中的数据。通过 Kibana,用户可以通过交互式的界面深入分析数据、观察趋势、检测异常等

ELK 的工作流程通常是这样的:Logstash 收集和处理各种数据源的日志数据,然后将处理后的数据发送到 Elasticsearch 进行索引和存储。用户可以使用 Kibana 来查询数据、创建可视化仪表板,从而更好地理解数据的情况

2. Elasticsearch 组件部署与使用

Elasticsearch 是 ELK 系统的核心组件,负责日志数据的存储、索引和搜索。它以分布式方式运行,能够快速对大量结构化或非结构化数据建立索引,并支持高效的全文搜索和聚合分析

2.1 环境准备

  1. 从 CentOS 7 模板机中克隆出三台:
主机名 IP 地址
node1 10.1.8.10
node2 10.1.8.11
apache 10.1.8.12
  1. 配置主机 IP 地址和主机名
bash 复制代码
[root@node1 ~]# nmcli connection modify ens33 ipv4.address 10.1.8.10
[root@node2 ~]# nmcli connection modify ens33 ipv4.address 10.1.8.11
[root@apache ~]# nmcli connection modify ens33 ipv4.address 10.1.8.12

[root@node1 ~]# hostnamectl set-hostname node1
[root@node2 ~]# hostnamectl set-hostname node2
[root@apache ~]# hostnamectl set-hostname apache

2.2 部署环境并安装 elasticsearch

分别在 node1node2 上执行:

bash 复制代码
# 1. 安装 Java 运行环境
[root@node1 ~]# yum install -y java
[root@node1 ~]# java -version
openjdk version "1.8.0_412"
OpenJDK Runtime Environment (build 1.8.0_412-b08)
OpenJDK 64-Bit Server VM (build 25.412-b08, mixed mode)

# 2. 配置 /etc/hosts
[root@node1 ~]# vim /etc/hosts
10.1.8.10  node1
10.1.8.11  node2
10.1.8.12  apache
[root@node1 ~]# scp /etc/hosts root@10.1.8.11:/etc/hosts
[root@node1 ~]# scp /etc/hosts root@10.1.8.12:/etc/hosts

# 3. 将 elasticsearch 软件包上传至虚拟机 /opt
[root@node1 ~]# cd /opt
[root@node1 opt]# # 将文件 elasticsearch-5.5.0.rpm 上传至此

# 4. 安装 elasticsearch
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm

# 5. 加载系统服务
[root@node1 opt]# systemctl daemon-reload    
[root@node1 opt]# systemctl enable elasticsearch.service

# 6. 编辑 elasticsearch 配置文件
[root@node1 opt]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
[root@node1 opt]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster # 17 行,配置集群名
node.name: node1 # 23 行,配置节点名
path.data: /data/elk_data # 33 行,配置数据存放路径
path.logs: /var/log/elasticsearch # 37 行,配置日志存放路径
bootstrap.memory_lock: false # 43 行,配置不在启动的时候锁定内存,防止 es 内存被交换出去
network.host: 0.0.0.0 # 55 行,提供服务绑定的IP地址,0.0.0.0 代表所有地址
http.port: 9200 # 59 行,配置侦听端口为 9200
discovery.zen.ping.unicast.hosts: ["host1","host2"] # 68 行,集群发现通过单播实现

# 7. 验证配置结果
[root@node1 opt]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster
node.name: node2
path.data: /data/elk_data
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1","node2"] # 集群主机名    

# 8. 创建数据存放路径并授权
[root@node1 opt]# mkdir -p /data/elk_data
[root@node1 opt]# chown elasticsearch:elasticsearch /data/elk_data/

# 9. 启动 elasticsearch 服务
[root@node1 opt]# systemctl start elasticsearch.service

# 10. 检查端口监听
[root@node1 opt]# yum install -y net-tools # 安装网络工具软件包
[root@node1 opt]# netstat -antp | grep 9200
tcp6  0  0  :::9200  :::*  LISTEN  64463/java

完成后可以在浏览器分别访问 10.1.8.10:920010.1.8.11:9200 查看结果,在此之前,请记得关闭防火墙和 SELinux

访问 10.1.8.10:9200/_cluster/health?pretty 可以检查集群健康状态,当 status 显示 green 时,说明集群状态良好

访问 10.1.8.10:9200/_cluster/state?pretty 可以查看集群详细信息

2.3 安装 elasticsearch-head 插件

上述查看集群的方式,及其不方便,我们可以通过安装 elasticsearch-head 插件后,来管理集群

上传 node-v8.2.1.tar.gz 软件包到 node1node2 主机的 /opt 目录下

分别在 node1node2 主机上执行以下命令

bash 复制代码
# 1. 安装 GCC 编译器软件包及工具
[root@node1 opt]# yum install gcc gcc-c++ make -y

# 2. 解压 node 软件包
[root@node1 opt]# tar -xzvf node-v8.2.1.tar.gz

# 3. 源码安装 node
[root@node1 opt]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure 
[root@node1 node-v8.2.1]# make -j8 # make -jX: 表示同时调用 X 个核心编译,取决于虚拟机核心数
[root@node1 node-v8.2.1]# make install

2.4 安装 phantomjs 前端框架

将软件包 phantomjs-2.1.1-linux-x86_64.tar.bz2 上传到 node1node2 主机的 /usr/local/src/ 目录下

分别在 node1node2 主机上执行以下命令

bash 复制代码
[root@node1 node-v8.2.1]# cd /usr/local/src/
[root@node1 src]# yum install -y bzip2 # 安装 bzip2 工具
[root@node1 src]# tar -xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2 # 解压软件包
[root@node1 src]# cd phantomjs-2.1.1-linux-x86_64/bin
[root@node1 bin]# cp phantomjs /usr/local/bin

2.5 安装 elasticsearch-head 数据可视化工具

将软件包 elasticsearch-head.tar.gz 上传到 node1node2 主机的 /usr/local/src/ 目录下

分别在 node1node2 主机上执行以下命令

bash 复制代码
[root@node1 bin]# cd /usr/local/src/
[root@node1 src]# tar -xzvf elasticsearch-head.tar.gz
[root@node1 src]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# npm install

2.6 修改主配置文件

分别在 node1node2 主机上执行以下命令

bash 复制代码
# 修改配置文件
[root@node1 ~]# cd ~
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true # 开启跨域访问支持,默认为false
http.cors.allow-origin: "*" # 跨域访问允许的域名地址

# 重启服务
[root@node1 ~]# systemctl restart elasticsearch
[root@node1 ~]# systemctl status elasticsearch

2.7 启动 elasticsearch-head 启动服务器

分别在 node1node2 主机上执行以下命令

bash 复制代码
[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start & # 切换到后台运行
[1] 114729
[root@node1 elasticsearch-head]# 
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt server

Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100

[root@node1 elasticsearch-head]# netstat -lnupt | grep 9100
tcp  0  0  0.0.0.0:9100  0.0.0.0:*  LISTEN  114739/grunt
[root@node1 elasticsearch-head]# netstat -lnupt | grep 9200
tcp6  0  0  :::9200  :::*  LISTEN  114626/java

完成配置后,打开浏览器,访问 10.1.8.10:9100,在地址栏输入 10.1.8.10:9200,点击 "连接",看到显示 "集群健康值: green (0 of 0)",表示配置成功

3. Logstash 组件部署与使用

Logstash 组件负责对输入数据进行处理并将结果输出到指定目标

3.1 创建索引

以下是一个创建索引的命令示例:

bash 复制代码
[root@node1 ~]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"Alex","mesg":"hello world"}'
# curl: 服务器数据传输命令
# -XPUT: 指定 HTTP 请求方式为 PUT
# 'localhost:9200/index-demo/test/1?pretty&pretty': 请求 URL,其内容包含:
#       localhost:9200: 服务器地址和端口
#       index-demo: 索引名
#       test: 文档类型
#       1: 文档 ID
#       pretty: 格式化返回结果(示例中重复了两次)
# -H 'content-Type: application/json': 请求头,指定请求内容类型为 JSON
# -d '{"user":"Alex","mesg":"hello world"}': 请求体,要创建的JSON文档内容

3.2 配置测试服务器 Apache

Apache 主机上执行以下命令

bash 复制代码
# 1. 安装 Apache
[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl start httpd

# 2. 安装 Java
[root@apache ~]# yum -y install java
[root@apache ~]# java -version

# 3. 安装 logstash
[root@apache ~]# cd /opt # 将软件包 logstash-5.5.1.rpm 上传至此
[root@apache opt]# rpm -ivh logstash-5.5.1.rpm # 安装 logstach
[root@apache opt]# systemctl enable logstash.service --now # 启用 logstach
[root@apache opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/

# 4. 测试
[root@apache opt]# logstash

3.3 输出日志

3.3.1 使用标准输入输出生成日志

此方式最简单,用于测试 Logstash 是否能正常接收和输出数据,输入的内容会直接被打印到终端

示例:

bash 复制代码
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{} }'
...
14:16:09.906 [...] INFO  logstash.agent - Successfully started Logstash API endpoint ...
# cn.bing.com
2025-11-04T06:16:29.961Z apache cn.bing.com
# www.sina.com.cn
2025-11-04T06:17:08.229Z apache www.sina.com.cn

3.3.2 使用 rubydebug 显示详细输出

通过 rubydebug 编解码器,可以以结构化格式显示事件的完整信息,方便调试和查看字段内容

示例:

bash 复制代码
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
14:32:13.237 [...] INFO  logstash.agent - Successfully started Logstash API endpoint ...
cn.bing.com  
{
    "@timestamp" => 2025-11-04T06:33:40.189Z,   # 时间戳
      "@version" => "1",
          "host" => "apache",                   # 主机名
       "message" => "cn.bing.com"               # 日志内容
}

3.3.3 使用 logstash 将信息写入 elasticsearch 中

此方式用于将日志数据写入 Elasticsearch,以便后续在 Kibana 中查询和可视化

bash 复制代码
[root@apache opt]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["10.1.8.10:9200"] } }'
14:35:13.001 [...] INFO  logstash.agent - Successfully started Logstash API endpoint ...
cn.bing.com 
www.google.com

完成以上操作后,在浏览器中打开 10.1.8.10:9100 可以看到多了一个 logstash-... 索引,说明日志已成功写入 Elasticsearch

4. kibana 部署与使用

Kibana 是 ELK 系统的可视化与交互层,用于展示、分析和搜索存储在 Elasticsearch 中的数据。通过 Web 界面,用户可以执行查询、查看日志详情、创建可视化图表和仪表盘,从而更直观地监控和分析系统运行状态

4.1 kibana 安装

将软件包 kibana-5.5.1-x86_64.rpm 上传至 node1 主机的 /usr/local/src 目录

bash 复制代码
# 1. 安装软件包
[root@node1 ~]# cd /usr/local/src/
[root@node1 src]# rpm -ivh kibana-5.5.1-x86_64.rpm # 安装软件包

# 2. 编辑配置文件
[root@node1 src]# cd /etc/kibana/
[root@node1 kibana]# cp kibana.yml kibana.yml.bak
[root@node1 kibana]# vim kibana.yml
server.port: 5601 # 2 行,配置 kibana 端口
server.host: "0.0.0.0"  # 7 行,配置 kibana 侦听地址
elasticsearch.url: "http://10.1.8.10:9200" # 21 行,和 elasticsearch 建立联系
kibana.index: ".kibana" # 30 行,在 elasticsearch 中添加 .kibana 索引

# 3. 启用服务
[root@node1 kibana]# systemctl enable kibana.service --now

4.2 kibana 使用

在浏览器中输入 10.1.8.10:5601 访问 kibana 首页

在 "Index name or pattern" 输入 system-*,点击 "Create"

完成后,点击侧边栏的 "Discover",可以看到 "system-*" 的日志记录

4.3 配置对接 Apache 主机的 Apache 日志文件

apache 主机上执行以下命令

bash 复制代码
[root@apache opt]# cd /etc/logstash/conf.d/
[root@apache conf.d]# vim apache_log.conf
input {
    file {
        path => "/etc/httpd/logs/access_log"
        type => "access"
        start_position => "beginning"
    }
    file {
        path => "/etc/httpd/logs/error_log"
        type => "error"
        start_position => "beginning"
    }
}

output {
    if [type] == "access" {
        elasticsearch {
            hosts => ["10.1.8.10:9200"]
            index => "apache_access-%{+YYYY.MM.dd}"
        }
    }
    if [type] == "error" {
        elasticsearch {
            hosts => ["10.1.8.10:9200"]
            index => "apache_error-%{+YYYY.MM.dd}"
        }
    }
}

[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf # 加载配置文件

完成后,打开浏览器,先访问 apache 主机的 IP 10.1.8.12,再打开 10.1.8.10:9100,可以看到多了 apache_errorapache_access

使用浏览器访问 kibana 管理页面 10.1.8.11:5601,点击侧边栏的 "Management",点击 "Index Patterns"

点击 "Create Index Pattern",分别创建 "apache_error-*" 和 "apache_access-*" 索引

完成后,点击侧边栏的 "Discover",即可对 "apache" 索引的日志进行监控

相关推荐
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [kernel][time]timekeeping
linux·笔记·学习
2301_796512522 小时前
Rust编程学习 - 如何理解Rust 语言提供了所有权、默认move 语义、借用、生命周期、内部可变性
java·学习·rust
charlie1145141913 小时前
从零开始理解 CSS:让网页“活”起来的语言2
前端·css·笔记·学习·选择器·样式表·原生
im_AMBER3 小时前
Leetcode 46
c语言·c++·笔记·学习·算法·leetcode
卡提西亚3 小时前
C++笔记-20-对象特性
开发语言·c++·笔记
2301_796512523 小时前
Rust编程学习 - 内存分配机制,如何动态大小类型和 `Sized` trait
学习·算法·rust
秦明月134 小时前
EPLAN电气设计:快捷键版本差异解析
经验分享·学习·学习方法·设计规范
@大嘴巴子5 小时前
零基础学习计算机网络编程----理解http协议
学习·计算机网络·http
_Brooke_5 小时前
CS336笔记2-Architectures,Hyperparameters
笔记