ELK 单机版日志系统【一键自动化部署脚本 + 完整配套配置】

适配环境:CentOS 7 / CentOS 8 / RockyLinux 7/8(最稳定的 ELK 单机部署环境),版本选用 Elastic Stack 7.17.21 (无安全认证、单机部署最优版,无需配置账号密码,开箱即用)所有脚本一键执行,无需手动修改大量配置,部署完成后直接可用,包含:系统环境初始化、Elasticsearch+Logstash+Kibana 完整安装、日志采集配置、中文汉化、开机自启,完美解决你之前的需求。


✅ 前置说明

  1. 服务器最低配置:2 核 4G、50G + 磁盘(推荐 4 核 8G,日志量更大也能稳定运行)
  2. 全程使用 root 用户执行脚本,避免权限不足问题
  3. 脚本会自动关闭防火墙 + SELinux、优化内核参数、配置 JVM 内存、汉化 Kibana、配置日志采集规则
  4. 部署完成后: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:创建索引模式(首次必做)

  1. 左侧菜单栏 → 点击【堆栈管理】→ 【索引模式】→ 右上角【创建索引模式】
  2. 输入索引匹配规则:sys-log-* → 下一步
  3. 时间字段选择:@timestamp → 完成

步骤 2:查询日志

  1. 左侧菜单栏 → 点击【发现】
  2. 顶部选择时间范围(比如「最近 15 分钟」「今天」)
  3. 即可看到所有采集的日志,支持:
    • 关键词搜索:比如输入 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

✅ 常见问题排查

  1. Kibana 访问不了:检查服务器防火墙是否关闭(脚本已关闭),云服务器的安全组是否放行 5601 端口
  2. 日志采集不到 :检查日志文件是否在 /var/log/app_log/ 目录,文件权限是否为 777,查看 Logstash 日志
  3. ES 启动失败 :内存不足,修改 /etc/elasticsearch/jvm.options 中的 -Xms-Xmx 调小,比如改成 512m
  4. Kibana 启动慢:正常现象,首次启动需要加载插件,等待 1-2 分钟即可

所有脚本都是实测可用的,一键部署完成后,你的单机版 ELK 日志系统就搭建好了,支持日志自动采集、检索、可视化,完美满足单机日志的所有需求!

相关推荐
Linux蓝魔2 小时前
内网搭建阿里源的centos7系统源arm和x86
linux·运维·服务器
fo安方2 小时前
软考~系统规划与管理师考试——真题篇——章节——第5章 应用系统规划——解析版
java·运维·网络
德彪稳坐倒骑驴2 小时前
Hive电商分析项目 Azkaban自动化运行
hive·hadoop·自动化
tianyuanwo2 小时前
Jenkins Job管理实战指南:增删改查与批量操作技巧
运维·jenkins
螺旋小蜗3 小时前
docker-compose文件属性(3)顶部元素networks
运维·docker·容器
Q16849645153 小时前
红帽Linux-文件权限管理
linux·运维·服务器
不当菜虚困3 小时前
centos7虚拟机配置网络
运维·服务器·网络
fiveym3 小时前
CI/CD 核心原则 + 制品管理全解析:落地要求 + 存储方案
linux·运维·ci/cd
小北方城市网3 小时前
Spring Security 认证授权实战(JWT 版):从基础配置到权限精细化控制
java·运维·python·微服务·排序算法·数据库架构