核心提要:ELK 栈是 Elasticsearch、Logstash、Kibana 三款工具的组合,核心作用是实现"日志收集→处理→存储→可视化分析"的全流程闭环。本文针对新手,基于 Linux 环境(CentOS 7/Ubuntu 18.04),详细拆解 ELK 栈的基础配置步骤,重点实现"收集系统日志→存储到 Elasticsearch→通过 Kibana 可视化查询",避开入门常见的环境依赖、配置语法等坑,帮助快速搭建可用的日志分析体系。
先明确核心组件分工(新手必懂):① Elasticsearch:分布式搜索引擎,负责存储日志数据并提供检索能力;② Logstash:日志收集与处理器,负责从目标源(如系统日志、应用日志)采集日志,格式化后发送到 Elasticsearch;③ Kibana:可视化平台,对接 Elasticsearch,通过界面实现日志的查询、统计、图表展示。
一、实操前置准备
1. 环境要求
-
操作系统:Linux(CentOS 7+/Ubuntu 18.04+,推荐单机测试,内存≥4G,避免内存不足导致组件启动失败);
-
依赖环境:Java 8/11(ELK 栈核心组件依赖 Java,推荐 Java 11,版本需统一);
-
网络要求:关闭防火墙(新手测试)或开放核心端口(9200、5601、5044); # Ubuntu 关闭防火墙命令:ufw disable
-
辅助工具:wget(下载安装包)、vim(编辑配置文件)、浏览器(访问 Kibana 界面); # Ubuntu 安装 wget 命令:apt install wget -y;安装 vim 命令:apt install vim -y
2. 前置依赖安装(Java 环境配置)
方案一:更换有效JDK 11下载源(手动下载部署)
选择国内可用的镜像源或官方有效路径,以下提供清华大学镜像源(稳定可用)的下载命令:
-
先删除无效的下载文件(如果有残留)
rm -f jdk-11.0.15_linux-x64_bin.tar.gz -
使用清华源下载OpenJDK 11(开源免费,功能与Oracle JDK一致)
# 下载OpenJDK 11.0.20(稳定版本,适配Linux x64) wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/11/jdk/x64/linux/OpenJDK11U-jdk_x64_linux_hotspot_11.0.20_8.tar.gz -
若你坚持要Oracle JDK 11,可使用Oracle官网(需要登录,或替换为其他有效镜像):
# 注意:Oracle JDK 11需登录账号才能下载,建议优先使用OpenJDK wget https://download.oracle.com/java/11/latest/jdk-11_linux-x64_bin.tar.gz
方案二:Ubuntu系统直接通过apt包管理器安装(更简便,推荐)
Ubuntu系统内置了OpenJDK 11的软件源,无需手动下载解压,一键安装即可:
-
更新软件源缓存
apt update -y -
安装OpenJDK 11 JDK(完整开发环境,包含JRE)
apt install openjdk-11-jdk -y -
若仅需运行环境(无需开发工具),可安装JRE:
apt install openjdk-11-jre -y
后续配置(环境变量设置,验证安装)
无论使用哪种方案,安装/解压后都需要配置JAVA_HOME环境变量,并验证是否生效:
1. 方案一(手动解压)的环境变量配置
-
创建JDK安装目录
mkdir -p /usr/local/java -
解压下载的JDK包到该目录(以清华源的OpenJDK为例,文件名请对应你的下载文件)
tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.20_8.tar.gz -C /usr/local/java/ -
编辑全局环境变量配置文件
vi /etc/profile -
在文件末尾添加以下内容(注意:
jdk-11.0.20+8需替换为你解压后的实际目录名)# JAVA_HOME配置 export JAVA_HOME=/usr/local/java/OpenJDK11U-jdk_x64_linux_hotspot_11.0.20_8 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH -
使环境变量立即生效
source /etc/profile
2. 方案二(apt安装)的环境变量配置
apt安装后,JDK默认路径为/usr/lib/jvm/java-11-openjdk-amd64/,直接配置即可:
-
编辑全局环境变量
vi /etc/profile -
在文件末尾添加
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH -
生效环境变量
source /etc/profile
3. 验证JDK是否安装成功
执行以下命令,若输出JDK版本信息,则说明安装配置成功:
# 查看JDK版本
java -version
# 查看javac版本(验证JDK开发环境,仅JDK有该命令,JRE无)
javac -version
组件版本选择(关键!避免版本不兼容)
ELK 栈各组件版本必须一致(如均选择 8.10.4 稳定版),否则会出现连接失败、数据解析异常等问题。本文选用 8.10.4 版本(2025年主流稳定版,兼容性好)。
二、操作步骤
步骤 1:安装并配置 Elasticsearch(日志存储核心)
1. 下载并解压 Elasticsearch
# 1. 创建统一工作目录
mkdir -p /opt/elk
cd /opt/elk
# 2. 下载 Elasticsearch 8.10.4
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.4-linux-x86_64.tar.gz
# 3. 解压并重命名(简化操作)
tar -zxvf elasticsearch-8.10.4-linux-x86_64.tar.gz
mv elasticsearch-8.10.4 elasticsearch
2. 创建专用用户(Elasticsearch 禁止 root 用户启动)
# 1. 创建 elk 用户并设置密码
useradd elk
passwd elk # 输入密码(如 elk@123456,新手记住简单密码即可)
# 2. 授权工作目录给 elk 用户
chown -R elk:elk /opt/elk
3. 修改 Elasticsearch 核心配置
# 1. 切换到 elk 用户
su - elk
# 2. 编辑配置文件
vim /opt/elk/elasticsearch/config/elasticsearch.yml
# 3. 核心配置内容(注释掉原有默认配置,添加以下内容)
cluster.name: elk-cluster # 集群名称(自定义,单机也需配置)
node.name: node-1 # 节点名称(单机单节点,自定义)
network.host: 0.0.0.0 # 绑定所有网卡,允许外部访问
http.port: 9200 # 核心端口(默认9200,可自定义)
discovery.type: single-node # 单机模式(新手必设,避免集群发现异常)
xpack.security.enabled: false # 关闭安全验证(新手简化配置,生产环境需开启)
action.auto_create_index: .monitoring*,* # 允许自动创建索引(日志存储需要)
4. 启动 Elasticsearch 并验证
# 1. 后台启动 Elasticsearch(必须用 elk 用户)
cd /opt/elk/elasticsearch/bin
nohup ./elasticsearch > /opt/elk/elasticsearch/nohup.out 2>&1 &
# 2. 验证启动状态(等待30秒左右,让服务完全启动)
# 方法1:查看端口是否占用
netstat -tnlp | grep 9200 # 看到 java 进程占用9200即启动成功
# 方法2:浏览器/终端访问验证
curl http://localhost:9200
# 预期输出(包含集群名称、节点名称等信息):
{
"name" : "node-1",
"cluster_name" : "elk-cluster",
"cluster_uuid" : "xxxxxxx",
"version" : {
"number" : "8.10.4",
...
},
"tagline" : "You Know, for Search"
}
步骤 2:安装并配置 Logstash(日志收集与处理)
1. 下载并解压 Logstash
# 1. 切换回 root 用户(下载安装包需要权限)
su - root
# 2. 进入工作目录
cd /opt/elk
# 3. 下载 Logstash 8.10.4
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.10.4-linux-x86_64.tar.gz
# 4. 解压并重命名
tar -zxvf logstash-8.10.4-linux-x86_64.tar.gz
mv logstash-8.10.4 logstash
# 5. 授权给 elk 用户
chown -R elk:elk /opt/elk/logstash
2. 配置 Logstash(收集系统日志→发送到 Elasticsearch)
Logstash 核心是"输入(Input)→过滤(Filter)→输出(Output)"的管道配置,本文以收集 Linux 系统日志(/var/log/messages)为例。
# 1. 切换到 elk 用户
su - elk
# 2. 创建自定义配置文件(推荐自定义,避免修改默认配置)
vim /opt/elk/logstash/config/system-log.conf
# 3. 配置内容(输入+过滤+输出)
input {
# 输入:收集系统日志 /var/log/messages
file {
path => "/var/log/messages" # 日志文件路径
type => "system-log" # 日志类型(自定义,便于后续分类)
start_position => "beginning" # 从文件开头开始收集
stat_interval => 1 # 每秒检查一次文件是否有新日志
}
}
filter {
# 过滤:格式化日志(提取时间、主机、日志内容,新手简化配置)
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:log_time} %{SYSLOGHOST:host} %{DATA:program}: %{GREEDYDATA:log_content}" }
}
# 转换时间格式(便于 Elasticsearch 识别)
date {
match => [ "log_time", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
target => "@timestamp"
}
}
output {
# 输出:发送到 Elasticsearch
elasticsearch {
hosts => ["http://localhost:9200"] # Elasticsearch 地址(与前文配置一致)
index => "system-log-%{+YYYY.MM.dd}" # 索引名称(按日期拆分,便于管理)
}
# 输出到终端(调试用,可删除)
stdout { codec => rubydebug }
}
3. 启动 Logstash 并验证
# 1. 后台启动 Logstash(用 elk 用户)
cd /opt/elk/logstash/bin
nohup ./logstash -f /opt/elk/logstash/config/system-log.conf > /opt/elk/logstash/nohup.out 2>&1 &
# 2. 验证启动状态
# 方法1:查看进程
ps -ef | grep logstash # 看到 logstash 相关进程即启动成功
# 方法2:查看 Elasticsearch 索引(确认日志已发送)
curl http://localhost:9200/_cat/indices?v
# 预期输出:会出现 system-log-当前日期 的索引(如 system-log-2025.08.20)
步骤 3:安装并配置 Kibana(日志可视化分析)
1. 下载并解压 Kibana
# 1. 切换回 root 用户
su - root
# 2. 进入工作目录
cd /opt/elk
# 3. 下载 Kibana 8.10.4
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.10.4-linux-x86_64.tar.gz
# 4. 解压并重命名
tar -zxvf kibana-8.10.4-linux-x86_64.tar.gz
mv kibana-8.10.4 kibana
# 5. 授权给 elk 用户
chown -R elk:elk /opt/elk/kibana
2. 修改 Kibana 核心配置
# 1. 切换到 elk 用户
su - elk
# 2. 编辑配置文件
vim /opt/elk/kibana/config/kibana.yml
# 3. 核心配置内容
server.port: 5601 # 核心端口(默认5601,浏览器访问用)
server.host: "0.0.0.0" # 绑定所有网卡,允许外部访问
elasticsearch.hosts: ["http://localhost:9200"] # 对接 Elasticsearch(与前文一致)
kibana.index: ".kibana" # Kibana 自身数据存储索引
i18n.locale: "zh-CN" # 中文界面(新手友好,可选)
3. 启动 Kibana 并验证
# 1. 后台启动 Kibana(用 elk 用户)
cd /opt/elk/kibana/bin
nohup ./kibana > /opt/elk/kibana/nohup.out 2>&1 &
# 2. 验证启动状态(等待60秒左右,服务完全启动)
netstat -tnlp | grep 5601 # 看到 node 进程占用5601即启动成功
# 3. 浏览器访问验证
# 地址:http://服务器IP:5601(如 http://192.168.1.100:5601)
# 预期:进入 Kibana 中文登录界面(因前文关闭 Elasticsearch 安全验证,无需登录,直接进入首页)
步骤 4:验证日志收集与分析全流程
1. 在 Kibana 中创建索引模式(关联 Elasticsearch 日志索引)
-
进入 Kibana 首页,点击左侧导航栏「管理」→「索引模式」→「创建索引模式」;
-
索引模式名称输入「system-log-*」(匹配 Logstash 配置的按日期拆分索引),点击「下一步」;
-
时间字段选择「@timestamp」(Logstash 过滤时设置的时间字段),点击「创建索引模式」;
-
创建成功后,左侧导航栏点击「Discover」,即可看到收集到的系统日志数据。
2. 日志查询与分析(新手常用操作)
-
简单查询:在搜索框输入关键词(如「error」),可筛选出包含错误信息的日志;
-
时间筛选:通过页面顶部的时间选择器(如「最近15分钟」),查看指定时间段的日志;
-
字段筛选:在左侧「可用字段」中勾选需要展示的字段(如「host」「log_content」),页面会只显示选中字段;
-
日志排序:点击「@timestamp」字段,可按时间正序/倒序排列日志(默认倒序,最新日志在最上方)。
三、入门常见坑与解决方案
坑 1:Elasticsearch 启动失败,提示"内存不足" 原因:Elasticsearch 默认堆内存设置为 1G,若服务器内存≤2G,会启动失败。解决方案:修改 Elasticsearch 堆内存配置:vim`` ``/opt/elk/elasticsearch/config/jvm.options将「-Xms1g」「-Xmx1g」改为「-Xms512m」「-Xmx512m」(不超过物理内存的一半),保存后重启 Elasticsearch。
坑 2:Logstash 启动失败,提示"权限不足" 原因:日志文件(如 /var/log/messages)的读取权限不足,或 Logstash 目录未授权给 elk 用户。解决方案:① 给日志文件添加读取权限:chmod 644 /var/log/messages;② 确保 Logstash 目录归属 elk 用户:chown -R elk:elk /opt/elk/logstash。
坑 3:Kibana 无法看到日志数据 原因:① 索引模式创建错误(未匹配 Logstash 配置的索引名称);② Logstash 未成功发送日志到 Elasticsearch;③ 时间字段选择错误。解决方案:① 检查索引模式名称是否为「system-log-*」;② 用 curl http://localhost:9200/_cat/indices?v 确认「system-log-当前日期」索引存在;③ 重新创建索引模式,确保时间字段选择「@timestamp」。
坑 4:浏览器无法访问 Kibana 原因:防火墙未开放 5601 端口,或 Kibana 未启动成功。解决方案:① 关闭防火墙(ufw disable);② 用 netstat -tnlp | grep 5601 确认 Kibana 已启动;③ 检查服务器 IP 是否正确,避免网络不通。
四、总结与进阶方向
1. 核心成果回顾
完成了「Logstash 收集系统日志→Elasticsearch 存储日志→Kibana 可视化分析」的 ELK 栈基础闭环,掌握了各组件的核心配置和日志查询的基本操作,可满足入门级日志分析需求。
2. 进阶学习方向
-
日志类型扩展:收集应用日志(如 Java 应用日志、Python 应用日志)、容器日志(Docker/K8s 日志);
-
Logstash 进阶:使用 Filebeat 替代 Logstash 收集日志(轻量级,适合分布式环境),Logstash 专注于日志处理;
-
可视化进阶:在 Kibana 中创建仪表盘(Dashboard),展示日志统计图表(如错误日志数量趋势、各主机日志分布);
-
生产环境优化:开启 Elasticsearch 安全验证、配置集群模式提高可用性、日志索引生命周期管理(自动删除过期日志)。