你是否曾为分散在多台服务器的日志头疼?想定位一个线上错误,得逐个登录机器,用grep、awk反复筛选,半小时过去还没找到关键信息?其实,一套 ELK Stack 就能解决日志集中管理的问题 —— 它能把分散的日志 “抓” 到一起,存起来、解析好,还能可视化展示,让查日志从 “大海捞针” 变成 “按图索骥”。
今天就带大家从零入门 ELK Stack,从环境准备到组件部署,再到实际分析日志,每一步都讲透,新手也能跟着做。
一、先搞懂:ELK Stack 到底是什么?
ELK Stack 是 Elastic 公司推出的一套日志管理工具组合,最初由 Elasticsearch、Logstash、Kibana 三个组件组成(三者首字母分别是 E、L、K,故称 ELK),后来又加入了轻量级数据采集工具 Beats,现在常说的 ELK Stack 其实包含这四个核心组件,各自分工明确:
-
• Elasticsearch:核心存储与检索引擎,类似 “数据库 + 搜索引擎”,能快速存储海量日志,并支持按关键词、字段等灵活查询; -
• Logstash:日志处理 “中间件”,负责从不同来源(文件、数据库、消息队列等)采集日志,做过滤、解析(比如把杂乱的日志拆成 “时间”“IP”“请求路径” 等结构化字段),再转发到 Elasticsearch; -
• Kibana:可视化界面,相当于 “操作面板”,能通过图表、表格等形式展示 Elasticsearch 中的日志数据,还能直接在界面上查日志、做分析; -
• Beats:轻量级采集器,比 Logstash 更小巧、资源占用更低,适合部署在每台需要采集日志的服务器上(比如用 Filebeat 采集日志文件,Metricbeat 采集系统指标),再把采集到的原始数据发给 Logstash 或直接发给 Elasticsearch。
简单说,一套 ELK Stack 能完成 “日志采集→处理→存储→查询→可视化” 的全流程,不管是几台还是几十台服务器的日志,都能集中管理。
二、环境准备:这些前提要先搞定
ELK Stack 对环境有一定要求,尤其是 Elasticsearch 对系统参数和 Java 环境比较敏感,新手踩坑大多出在这一步,所以先把环境准备好。
1. 系统选择
推荐用 Linux 系统(生产环境也基本是 Linux),这里以 CentOS 7.x 为例(Ubuntu 操作类似,只是包管理命令换成apt),服务器配置建议:
-
• 内存:至少 2GB(Elasticsearch 建议单独分配 1GB 以上内存,内存不足会导致启动失败或查询卡顿); -
• 硬盘:至少 20GB 空闲空间(日志存储会占用较多空间,生产环境需根据日志量规划); -
• 网络:服务器之间能互通(如果部署多节点,比如多台服务器分别装 Beats 和 Elasticsearch),并开放后续需要的端口(9200、5601 等)。
2. 安装 Java 环境
Elasticsearch、Logstash 都依赖 Java,注意版本对应:ELK Stack 7.x 版本建议用 Java 11(官方推荐,避免用 Java 8 或 17 出现兼容性问题)。
步骤如下:
\# 1. 卸载系统自带的 OpenJDK(如果有)
rpm -qa | grep java | xargs rpm -e --nodeps
\# 2. 下载 Java 11(用 Oracle 或 AdoptOpenJDK,这里以 AdoptOpenJDK 为例)
wget https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jdk\_x64\_linux\_hotspot\_11.0.21\_9.tar.gz
\# 3. 解压到 /usr/local/java 目录
mkdir -p /usr/local/java
tar -zxvf OpenJDK11U-jdk\_x64\_linux\_hotspot\_11.0.21\_9.tar.gz -C /usr/local/java/
\# 4. 配置环境变量,编辑 /etc/profile 文件
vi /etc/profile
\# 在文件末尾添加:
export JAVA\_HOME=/usr/local/java/jdk-11.0.21+9
export PATH=\$PATH:\$JAVA\_HOME/bin
\# 5. 生效环境变量
source /etc/profile
\# 6. 验证是否安装成功(显示 java version "11.0.21" 即正常)
java -version
3. 修改系统参数(关键!避免 Elasticsearch 启动失败)
Elasticsearch 启动时需要足够的文件描述符和线程数,默认系统配置可能不够,需修改:
\# 1. 编辑系统限制配置文件
vi /etc/security/limits.conf
\# 添加以下内容(\* 表示所有用户,也可指定后续创建的 ES 用户)
\* soft nofile 65535
\* hard nofile 65535
\* soft nproc 4096
\* hard nproc 4096
\# 2. 编辑内核参数配置文件
vi /etc/sysctl.conf
\# 添加以下内容(禁用内存交换,避免 ES 性能下降;允许最大虚拟内存)
vm.swappiness = 0
vm.max\_map\_count = 262144
\# 3. 生效内核参数
sysctl -p
\# 4. 重启服务器(让 limits.conf 配置生效,不重启可能不生效)
reboot
重启后,用ulimit -n查看文件描述符,显示 65535 即配置成功。
三、组件部署:从 Elasticsearch 到 Kibana,一步一步来
ELK Stack 组件版本必须一致(比如都用 7.17.10,这是 7.x 系列的 LTS 版本,稳定且长期支持),避免兼容性问题。下面按 “Elasticsearch → Logstash → Kibana → Filebeat” 的顺序部署(单节点部署,适合新手入门;生产环境需考虑多节点集群)。
1. 部署 Elasticsearch(核心存储)
步骤 1:下载并安装 Elasticsearch
\# 1. 添加 Elastic 官方 YUM 源(方便后续安装和更新)
cat > /etc/yum.repos.d/elastic.repo << EOF
\[elastic-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
\# 2. 安装 Elasticsearch(7.17.10 版本)
yum install -y elasticsearch-7.17.10
步骤 2:修改 Elasticsearch 配置文件
Elasticsearch 核心配置文件是/etc/elasticsearch/elasticsearch.yml,主要修改以下参数(其他默认即可):
vi /etc/elasticsearch/elasticsearch.yml
\# 1. 集群名称(单节点也需配置,后续 Kibana 要对应)
cluster.name: my-elk-cluster
\# 2. 节点名称(单节点随意,比如 node-1)
node.name: node-1
\# 3. 允许外部访问(默认只允许 localhost 访问,改成 0.0.0.0 让其他机器能连)
network.host: 0.0.0.0
\# 4. 初始化节点(单节点填 \["localhost"],多节点填其他节点 IP)
discovery.seed\_hosts: \["localhost"]
\# 5. 初始主节点(单节点填节点名称,即 node-1)
cluster.initial\_master\_nodes: \["node-1"]
\# 6. 数据和日志存储路径(默认在 /var/lib/elasticsearch 和 /var/log/elasticsearch,可自定义)
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
步骤 3:启动 Elasticsearch 并验证
注意:Elasticsearch 不能用 root 用户启动,系统安装时会自动创建elasticsearch用户,需用这个用户启动:
\# 1. 启动 Elasticsearch 服务,并设置开机自启
systemctl start elasticsearch
systemctl enable elasticsearch
\# 2. 等待 1-2 分钟(ES 启动需要时间),验证是否启动成功
curl http://localhost:9200
\# 成功会返回类似以下内容(包含集群名称、版本等信息)
{
  "name" : "node-1",
  "cluster\_name" : "my-elk-cluster",
  "cluster\_uuid" : "xxxxxx",
  "version" : {
  "number" : "7.17.10",
  "build\_flavor" : "default",
  "build\_type" : "rpm",
  "build\_hash" : "xxxxxx",
  "build\_date" : "2023-07-20T15:56:39.040728659Z",
  "build\_snapshot" : false,
  "lucene\_version" : "8.11.1",
  "minimum\_wire\_compatibility\_version" : "6.8.0",
  "minimum\_index\_compatibility\_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
如果启动失败,先看日志排查问题:tail -f /var/log/elasticsearch/my-elk-cluster.log,常见问题有 “内存不足”“系统参数没配置好”“用 root 用户启动”。
2. 部署 Logstash(日志处理)
Logstash 主要用来 “过滤日志”,比如把 Nginx 的原始日志(像192.168.1.1`` - - [20/Oct/2024:10:00:00 +0800] "GET /index.html HTTP/1.1" 200 1024)拆成 “客户端 IP”“时间”“请求方法”“状态码” 等结构化字段,方便后续查询。
步骤 1:安装 Logstash
\# 用 YUM 安装(和 ES 同版本 7.17.10)
yum install -y logstash-7.17.10
步骤 2:创建 Logstash 配置文件
Logstash 配置文件分 “输入(input)”“过滤(filter)”“输出(output)” 三部分,这里以 “采集本地 Nginx 日志→解析日志→输出到 Elasticsearch” 为例,创建配置文件:
\# 创建配置文件目录(默认在 /etc/logstash/conf.d/)
vi /etc/logstash/conf.d/nginx-log.conf
\# 配置内容如下
input {
  \# 从文件采集日志(也可以用 beats 输入,后续结合 Filebeat 会讲)
  file {
  path => "/var/log/nginx/access.log" # Nginx 访问日志路径(先确保 Nginx 已安装,或先填一个测试文件路径)
  start\_position => "beginning" # 从文件开头开始采集
  sincedb\_path => "/dev/null" # 每次重启都重新采集(测试用,生产环境需保留 sincedb 避免重复采集)
  }
}
filter {
  \# 用 grok 模式解析 Nginx 访问日志(grok 是 Logstash 常用的日志解析工具)
  grok {
  match => { "message" => "%{IPORHOST:client\_ip} %{USER:remote\_user} %{USER:auth} \\\[%{HTTPDATE:request\_time}\\] \\"%{WORD:http\_method} %{URIPATHPARAM:request\_path} HTTP/%{NUMBER:http\_version}\\" %{NUMBER:status\_code} %{NUMBER:response\_size}" }
  }
  \# 把 status\_code(状态码)、response\_size(响应大小)从字符串转成数字(方便后续统计)
  mutate {
  convert => {
  "status\_code" => "integer"
  "response\_size" => "integer"
  }
  }
}
output {
  \# 输出到 Elasticsearch
  elasticsearch {
  hosts => \["http://localhost:9200"] # Elasticsearch 地址
  index => "nginx-access-log-%{+YYYY.MM.dd}" # 索引名称(按日期分片,方便管理)
  }
  \# 同时输出到控制台(测试用,方便查看解析结果)
  stdout {
  codec => rubydebug
  }
}
如果还没装 Nginx,先快速装一个生成日志:yum install -y nginx && systemctl start nginx,访问服务器 IP 生成几条访问日志。
步骤 3:启动 Logstash 并验证
\# 1. 启动 Logstash 服务(用 logstash 用户启动,系统自动创建)
systemctl start logstash
systemctl enable logstash
\# 2. 验证日志是否解析并输出到 ES
\# 先看 Logstash 日志,确认无报错
tail -f /var/log/logstash/logstash-plain.log
\# 再用 curl 查看 ES 中的索引(如果看到 nginx-access-log-2024.10.20 类似索引,说明成功)
curl http://localhost:9200/\_cat/indices?v
3. 部署 Kibana(可视化界面)
Kibana 是 ELK 的 “门面”,通过网页就能操作 Elasticsearch,查日志、做图表都靠它。
步骤 1:安装 Kibana
yum install -y kibana-7.17.10
步骤 2:修改 Kibana 配置文件
Kibana 配置文件是/etc/kibana/kibana.yml,主要配置访问地址和 Elasticsearch 连接地址:
vi /etc/kibana/kibana.yml
\# 1. 允许外部访问(默认只允许 localhost,改成 0.0.0.0)
server.host: "0.0.0.0"
\# 2. 连接 Elasticsearch 的地址(和前面部署的 ES 一致)
elasticsearch.hosts: \["http://localhost:9200"]
\# 3. 配置中文界面(新手友好,可选)
i18n.locale: "zh-CN"
步骤 3:启动 Kibana 并访问
\# 1. 启动 Kibana 服务(开机自启)
systemctl start kibana
systemctl enable kibana
\# 2. 访问 Kibana 界面(默认端口 5601)
\# 打开浏览器,输入 http://服务器IP:5601,首次访问需要等待 1-2 分钟加载
\# 3. 首次使用:创建索引模式(让 Kibana 识别 ES 中的日志索引)
\# ① 点击左侧菜单栏「Management」→「Stack Management」→「Kibana」→「索引模式」→「创建索引模式」
\# ② 输入索引模式名称(比如 nginx-access-log-\*,匹配所有日期的 Nginx 访问日志索引)
\# ③ 选择时间字段(request\_time,日志的请求时间),点击「创建索引模式」
\# 4. 查看日志:点击左侧菜单栏「Discover」,选择刚创建的索引模式,就能看到解析后的 Nginx 日志了
\# 可以按字段筛选,比如搜索 status\_code:404 查看404错误日志,或 client\_ip:192.168.1.1 查看某个IP的访问记录
Kibana 还有 “仪表盘(Dashboard)” 功能,比如制作 “Nginx 访问量 TOP10 IP”“HTTP 状态码分布” 图表,新手可以先从「Visualize Library」创建简单图表,再组合成仪表盘。
4. 部署 Filebeat(轻量级采集)
前面 Logstash 是直接从本地文件采集日志,但如果有 10 台服务器都要采集日志,在每台服务器装 Logstash 会占用太多资源(Logstash 内存占用较高)。这时就需要 Filebeat—— 它轻量级(内存占用通常不到 100MB),部署在每台需要采集日志的服务器上,把日志发给 Logstash 或直接发给 Elasticsearch。
这里以 “Filebeat 采集 Nginx 日志→发给 Logstash 解析→输出到 ES” 为例:
步骤 1:安装 Filebeat
yum install -y filebeat-7.17.10
步骤 2:修改 Filebeat 配置文件
Filebeat 配置文件是/etc/filebeat/filebeat.yml,主要配置 “采集源(inputs)” 和 “输出目标(outputs)”:
vi /etc/filebeat/filebeat.yml
\# 1. 配置采集源(采集 Nginx 访问日志)
filebeat.inputs:
\- type: filestream # 新版 Filebeat 用 filestream 类型,旧版是 log
  enabled: true
  paths:
  \- /var/log/nginx/access.log # Nginx 访问日志路径
\# 2. 关闭默认输出到 ES(改成输出到 Logstash)
output.elasticsearch:
  enabled: false # 关闭
\# 3. 配置输出到 Logstash
output.logstash:
  hosts: \["localhost:5044"] # Logstash 默认监听 5044 端口接收 Beats 数据
\# 4. 启用 Filebeat 模块(可选,Nginx 模块能自动解析日志,不用自己写 grok 模式)
filebeat.config.modules:
  path: \${path.config}/modules.d/\*.yml
  reload.enabled: false
\# (可选)启用 Nginx 模块,自动解析日志
\# filebeat modules enable nginx
\# 然后修改模块配置:/etc/filebeat/modules.d/nginx.yml,指定日志路径
步骤 3:修改 Logstash 配置,接收 Filebeat 数据
之前 Logstash 是从文件采集,现在改成从 Filebeat 采集,修改/etc/logstash/conf.d/nginx-log.conf的 input 部分:
input {
  # 替换原来的 file 输入,改成 beats 输入
  beats {
  port => 5044 # 和 Filebeat 配置的端口一致
  }
}
\# filter 和 output 部分不变,保存退出
步骤 4:重启服务并验证
\# 1. 重启 Logstash 和 Filebeat
systemctl restart logstash
systemctl restart filebeat
systemctl enable filebeat
\# 2. 验证:访问 Nginx 生成日志,在 Kibana 的 Discover 界面查看,能看到新的日志即成功
四、实际场景:用 ELK 查一次 Nginx 错误日志
学会部署后,关键是会用它解决实际问题。比如 “网站出现 500 错误,想查最近 10 分钟的 500 错误日志,看是哪些请求导致的”,步骤如下:
-
1. 打开 Kibana Discover 界面:选择索引模式 nginx-access-log-*,时间范围选 “最近 10 分钟”(右上角时间选择器); -
2. 筛选 500 错误日志:在搜索框输入 status_code:500,按回车,下方会显示所有 500 错误的日志; -
3. 查看关键信息:日志已解析成结构化字段,直接看 client_ip(哪个 IP 访问的)、request_path(访问了哪个路径)、request_time(错误发生时间); -
4. 进一步分析:如果想知道 “哪个路径的 500 错误最多”,可以点击左侧字段列表的 request_path,选择 “显示顶级值”,就能看到按错误次数排序的请求路径,快速定位问题接口。
如果是更复杂的分析,比如 “每天的 500 错误数量趋势”,可以在 Kibana 新建 “折线图” 可视化:
-
• 「Visualize Library」→「创建可视化」→「折线图」; -
• 选择索引模式,Y 轴选 “计数”,X 轴选 “日期直方图”,时间间隔选 “1 天”; -
• 添加筛选条件 status_code:500,保存后就能看到每天 500 错误的变化趋势。
五、新手必看:这些坑要避开
-
1. 版本不一致:ELK 所有组件必须同版本(比如都用 7.17.10),否则会出现 “Kibana 连不上 ES”“日志解析失败” 等问题; -
2. 内存不足:ES 至少分配 1GB 内存,建议在 /etc/elasticsearch/jvm.options中调整(-Xms1g -Xmx1g,Xmx 不超过物理内存的 50%); -
3. 安全问题:默认配置下,ES、Kibana 没有认证,任何人都能访问,生产环境必须开启认证(ES 开启 xpack.security,设置用户名密码;Kibana 配置对应认证信息); -
4. 日志重复采集:Filebeat 默认会记录采集位置(sincedb 文件),避免重复采集,测试时设置 sincedb_path: /dev/null,生产环境要删除这行; -
5. grok 解析错误:如果日志解析后 “_grokparsefailure” 字段为 true,说明 grok 模式和日志格式不匹配,需要调整 grok 表达式(可以用 Kibana 的「Dev Tools」→「Grok Debugger」调试)。
六、总结
ELK Stack 虽然组件多,但核心逻辑很清晰:用 Beats 采集、Logstash 处理、Elasticsearch 存储、Kibana 展示。零基础入门的关键是 “先跑通流程”—— 从单节点部署开始,再逐步尝试多节点、开启认证、对接更多日志源(比如 Tomcat 日志、系统日志)。
如果在部署过程中遇到问题,优先看官方日志(ES 日志、Logstash 日志),其次查 Elastic 官方文档(https://www.elastic.co/guide/index.html),文档对每个参数、每个步骤都讲得很详细,比网上零散的教程更靠谱。
日志管理是运维、开发的基础工作,学会 ELK Stack 不仅能提高工作效率,还能为后续的监控、告警(比如结合 Alerting 插件,当 500 错误超过阈值时发邮件告警)打下基础。动手试试吧,第一次成功查找到日志的那一刻,你会觉得之前的配置都值得!

