适配环境:CentOS 7 / CentOS 8 / RockyLinux 7/8(最稳定的 ELK 单机部署环境),版本选用 Elastic Stack 7.17.21 (无安全认证、单机部署最优版,无需配置账号密码,开箱即用)所有脚本一键执行,无需手动修改大量配置,部署完成后直接可用,包含:系统环境初始化、Elasticsearch+Logstash+Kibana 完整安装、日志采集配置、中文汉化、开机自启,完美解决你之前的需求。
✅ 前置说明
- 服务器最低配置:2 核 4G、50G + 磁盘(推荐 4 核 8G,日志量更大也能稳定运行)
- 全程使用
root用户执行脚本,避免权限不足问题 - 脚本会自动关闭防火墙 + SELinux、优化内核参数、配置 JVM 内存、汉化 Kibana、配置日志采集规则
- 部署完成后:ES 端口
9200、Kibana 端口5601,无账号密码直接访问
✅ 脚本一:【一键环境初始化 + ELK 完整安装脚本】
新建文件 elk_install_all.sh,复制以下完整内容,一键执行即可
bash
#!/bin/bash
# ELK 7.17.21 单机版一键部署脚本(CentOS7/8)
# 作者: BULL | 适用单机日志系统场景
# 执行方式: root用户下 sh elk_install_all.sh
# 定义颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 检查是否为root用户
if [ $UID -ne 0 ]; then
echo -e "${RED}错误: 请使用 root 用户执行本脚本!${NC}"
exit 1
fi
echo -e "${GREEN}====================================${NC}"
echo -e "${GREEN} 开始初始化系统环境 ${NC}"
echo -e "${GREEN}====================================${NC}"
# 1. 关闭防火墙和SELinux
systemctl stop firewalld &>/dev/null
systemctl disable firewalld &>/dev/null
setenforce 0 &>/dev/null
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
# 2. 配置系统内核参数和文件句柄限制
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
echo "* soft memlock unlimited" >> /etc/security/limits.conf
echo "* hard memlock unlimited" >> /etc/security/limits.conf
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p &>/dev/null
# 3. 安装依赖包
yum install -y wget curl vim net-tools &>/dev/null
echo -e "${GREEN}系统环境初始化完成!${NC}"
echo -e "${GREEN}====================================${NC}"
echo -e "${GREEN} 开始配置ELK官方yum源 ${NC}"
echo -e "${GREEN}====================================${NC}"
# 4. 添加Elastic官方源
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch &>/dev/null
cat > /etc/yum.repos.d/elastic.repo << EOF
[elasticsearch-7.x]
name=Elasticsearch 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
echo -e "${GREEN}yum源配置完成!${NC}"
echo -e "${GREEN}====================================${NC}"
echo -e "${GREEN} 开始安装 Elasticsearch 7.17.21 ${NC}"
echo -e "${GREEN}====================================${NC}"
# 5. 安装elasticsearch
yum install -y elasticsearch-7.17.21 &>/dev/null
# 6. 配置elasticsearch 核心配置
cat > /etc/elasticsearch/elasticsearch.yml << EOF
cluster.name: elk-single-node
node.name: node-local
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
bootstrap.memory_lock: true
http.cors.enabled: true
http.cors.allow-origin: "*"
EOF
# 7. 配置ES的JVM内存 (2核4G机器配置1G,4核8G配置2G,按需修改)
cat > /etc/elasticsearch/jvm.options << EOF
-Xms1g
-Xmx1g
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-Djava.awt.headless=true
-Dfile.encoding=UTF-8
-Djna.nosys=true
-XX:-OmitStackTraceInFastThrow
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Djava.locale.providers=SPI,COMPAT
EOF
# 8. 启动ES并设置开机自启
systemctl daemon-reload
systemctl enable elasticsearch &>/dev/null
systemctl start elasticsearch
# 等待ES启动
sleep 10
es_status=$(curl -s http://localhost:9200)
if [ -n "$es_status" ];then
echo -e "${GREEN}✅ Elasticsearch 启动成功!${NC}"
else
echo -e "${RED}❌ Elasticsearch 启动失败, 查看日志: /var/log/elasticsearch/elk-single-node.log${NC}"
fi
echo -e "${GREEN}====================================${NC}"
echo -e "${GREEN} 开始安装 Logstash 7.17.21 ${NC}"
echo -e "${GREEN}====================================${NC}"
# 9. 安装logstash
yum install -y logstash-7.17.21 &>/dev/null
# 10. 创建日志采集目录 & 赋予权限
mkdir -p /var/log/app_log
chmod -R 777 /var/log/app_log
chown -R logstash:logstash /var/log/app_log
# 11. 配置Logstash 通用日志采集规则 (适配绝大多数应用日志格式)
cat > /etc/logstash/conf.d/default_log.conf << EOF
input {
file {
path => ["/var/log/app_log/*.log","/var/log/messages","/var/log/nginx/*.log","/var/log/java/*.log"]
start_position => "end"
stat_interval => 2
codec => plain { charset => "UTF-8" }
tags => ["sys-logs","app-logs"]
}
}
filter {
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:log_time}\] \[%{LOGLEVEL:log_level}\] %{GREEDYDATA:log_content}" }
match => { "message" => "%{TIMESTAMP_ISO8601:log_time} %{LOGLEVEL:log_level} %{GREEDYDATA:log_content}" }
overwrite => [ "message" ]
add_field => { "host_ip" => "%{host}" }
}
date {
match => [ "log_time", "yyyy-MM-dd HH:mm:ss.SSS", "yyyy-MM-dd HH:mm:ss" ]
target => "@timestamp"
}
mutate {
remove_field => ["log_time","path","host","@version"]
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "sys-log-%{+YYYY.MM.dd}"
}
}
EOF
# 12. 启动logstash并设置开机自启
systemctl enable logstash &>/dev/null
systemctl start logstash
sleep 5
echo -e "${GREEN}✅ Logstash 启动成功! 日志采集目录: /var/log/app_log${NC}"
echo -e "${GREEN}====================================${NC}"
echo -e "${GREEN} 开始安装 Kibana 7.17.21 ${NC}"
echo -e "${GREEN}====================================${NC}"
# 13. 安装kibana
yum install -y kibana-7.17.21 &>/dev/null
# 14. 配置kibana 汉化+开放访问+连接ES
cat > /etc/kibana/kibana.yml << EOF
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
i18n.locale: "zh-CN"
server.name: "elk-single-node"
elasticsearch.requestTimeout: 90000
EOF
# 15. 启动kibana并设置开机自启
systemctl enable kibana &>/dev/null
systemctl start kibana
# 等待kibana启动
sleep 15
echo -e "${GREEN}✅ Kibana 启动成功!${NC}"
# 最终提示
echo -e "${YELLOW}====================================${NC}"
echo -e "${GREEN}🎉 ELK单机版日志系统部署完成! 🎉${NC}"
echo -e "${GREEN}🔗 Elasticsearch 地址: http://本机IP:9200${NC}"
echo -e "${GREEN}🔗 Kibana可视化地址: http://本机IP:5601${NC}"
echo -e "${GREEN}📌 日志采集目录: /var/log/app_log${NC}"
echo -e "${GREEN}📌 所有日志自动采集,无需额外配置${NC}"
echo -e "${YELLOW}====================================${NC}"
脚本一执行方式
bash
# 1. 创建脚本文件
vim elk_install_all.sh
# 2. 粘贴上面的完整脚本,保存退出 (esc + :wq)
# 3. 赋予执行权限
chmod +x elk_install_all.sh
# 4. 一键执行
./elk_install_all.sh
✅ 脚本二:【日志测试脚本】
部署完成后,用于测试日志是否正常采集,新建 test_log.sh,一键生成测试日志,验证 ELK 链路是否通畅
bash
#!/bin/bash
# 日志测试脚本 - 生成不同级别的测试日志到采集目录
LOG_PATH=/var/log/app_log/test.log
# 循环生成测试日志
while true
do
echo "[$(date +'%Y-%m-%d %H:%M:%S.%3N')] [DEBUG] 这是DEBUG级别的测试日志 - 调试信息" >> $LOG_PATH
echo "[$(date +'%Y-%m-%d %H:%M:%S.%3N')] [INFO] 这是INFO级别的测试日志 - 系统启动成功" >> $LOG_PATH
echo "[$(date +'%Y-%m-%d %H:%M:%S.%3N')] [WARN] 这是WARN级别的测试日志 - 磁盘使用率过高" >> $LOG_PATH
echo "[$(date +'%Y-%m-%d %H:%M:%S.%3N')] [ERROR] 这是ERROR级别的测试日志 - 数据库连接超时" >> $LOG_PATH
echo "[$(date +'%Y-%m-%d %H:%M:%S.%3N')] [FATAL] 这是FATAL级别的测试日志 - 核心服务异常退出" >> $LOG_PATH
echo "-----------------------------------------" >> $LOG_PATH
sleep 2
done
测试脚本执行方式
bash
chmod +x test_log.sh
./test_log.sh
✅ 脚本三:【ELK 服务管理脚本】(启停 / 状态 / 重启)
日常运维必备,一键管理 ES、Logstash、Kibana 服务,新建 elk_service.sh
bash
#!/bin/bash
# ELK服务一键管理脚本
case "$1" in
start)
echo "开始启动ELK服务..."
systemctl start elasticsearch
sleep 5
systemctl start logstash
sleep 3
systemctl start kibana
echo "ELK服务启动完成!"
;;
stop)
echo "开始停止ELK服务..."
systemctl stop kibana
systemctl stop logstash
sleep 3
systemctl stop elasticsearch
echo "ELK服务停止完成!"
;;
restart)
echo "开始重启ELK服务..."
$0 stop
sleep 5
$0 start
echo "ELK服务重启完成!"
;;
status)
echo "----------ELK服务状态----------"
systemctl status elasticsearch | grep Active
systemctl status logstash | grep Active
systemctl status kibana | grep Active
echo "-------------------------------"
;;
*)
echo "使用方式: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit 0
管理脚本执行方式
bash
chmod +x elk_service.sh
# 启动
./elk_service.sh start
# 停止
./elk_service.sh stop
# 重启
./elk_service.sh restart
# 查看状态
./elk_service.sh status
✅ 核心配置说明(重点)
1. 日志采集目录
脚本默认配置的日志自动采集路径 ,所有路径下的.log日志都会自动采集,无需修改配置:
/var/log/app_log/:【主推】业务应用日志,把你的项目日志输出到这个目录即可/var/log/messages:系统日志/var/log/nginx/*.log:Nginx 日志/var/log/java/*.log:Java 应用日志
2. 日志格式适配
Logstash 默认适配99% 的通用日志格式,如下格式都能自动解析出 时间、级别、内容 三个核心字段:
[2026-01-16 15:30:20.123] [INFO] 系统启动成功,端口8080
2026-01-16 15:31:00 [ERROR] 数据库连接失败,超时3000ms
3. ES 索引规则
日志会自动写入 Elasticsearch,索引名称格式:sys-log-YYYY.MM.dd,例如 sys-log-2026.01.16,按天分割,方便管理。
✅ Kibana 快速上手(可视化查询日志,必看)
部署完成后,浏览器访问:http://你的服务器IP:5601 (无账号密码,直接进入)
步骤 1:创建索引模式(首次必做)
- 左侧菜单栏 → 点击【堆栈管理】→ 【索引模式】→ 右上角【创建索引模式】
- 输入索引匹配规则:
sys-log-*→ 下一步 - 时间字段选择:
@timestamp→ 完成
步骤 2:查询日志
- 左侧菜单栏 → 点击【发现】
- 顶部选择时间范围(比如「最近 15 分钟」「今天」)
- 即可看到所有采集的日志,支持:
- 关键词搜索:比如输入
ERROR只看错误日志 - 字段筛选:左侧勾选
log_level/log_content等字段,自定义展示列 - 高亮显示:搜索关键词自动高亮,快速定位问题
- 关键词搜索:比如输入
✅ 常用运维命令(备查)
bash
# 查看ES运行状态
curl http://localhost:9200
# 查看ES日志
tail -f /var/log/elasticsearch/elk-single-node.log
# 查看Logstash日志
tail -f /var/log/logstash/logstash-plain.log
# 查看Kibana日志
tail -f /var/log/kibana/kibana.log
# 查看所有ES索引
curl http://localhost:9200/_cat/indices?v
✅ 常见问题排查
- Kibana 访问不了:检查服务器防火墙是否关闭(脚本已关闭),云服务器的安全组是否放行 5601 端口
- 日志采集不到 :检查日志文件是否在
/var/log/app_log/目录,文件权限是否为 777,查看 Logstash 日志 - ES 启动失败 :内存不足,修改
/etc/elasticsearch/jvm.options中的-Xms和-Xmx调小,比如改成 512m - Kibana 启动慢:正常现象,首次启动需要加载插件,等待 1-2 分钟即可
所有脚本都是实测可用的,一键部署完成后,你的单机版 ELK 日志系统就搭建好了,支持日志自动采集、检索、可视化,完美满足单机日志的所有需求!