ELK企业日志分析系统实战部署

从零搭建 ELK 企业级日志分析系统,这一篇就够了(附完整部署步骤)

管理几十上百台服务器,还在一台台登录上去 tail -f 查日志?grep 搜到怀疑人生?这篇文章带你从零搭建一套 ELK 集中化日志分析平台,看完就能上手实操。


一、为什么要用 ELK?

先说痛点。传统查日志的方式:

  • 几十台机器,每台登录上去 tail -f,繁琐又效率低下
  • 用 grep、awk、wc 做统计,机器一多根本跑不动
  • 日志分散在各个节点,出了问题根本不知道去哪查

ELK 就是来解决这个问题的。

它由三个开源工具组成:

组件 定位 通俗理解
Elasticsearch 分布式搜索和分析引擎 超级金库,存数据+毫秒级查询
Logstash 服务器端数据处理管道 搬运工,收集+解析+转换日志
Kibana 数据可视化平台 大屏幕,把数据变成图表

整体数据流:

复制代码
日志数据源 → Logstash(收集处理) → Elasticsearch(存储索引) → Kibana(可视化展示)

💡 现在生产环境一般会在采集端加一层 Filebeat(Beats 家族),更轻量,替代 Logstash 的采集功能。


二、实验环境准备

用 CentOS 7.9 克隆三台虚拟机:

主机名 IP 地址 部署服务
node1 192.168.108.41 Elasticsearch + Kibana
node2 192.168.108.42 Elasticsearch
apache 192.168.108.43 Logstash + Apache

确保三台机器都关闭防火墙和 SELinux,Java 环境是 1.8。


三、部署 Elasticsearch 集群

1. 配置 hosts 解析

在 node1 和 node2 上都执行:

bash 复制代码
vim /etc/hosts

添加:

复制代码
192.168.108.41   node1
192.168.108.42   node2

2. 安装 Elasticsearch

在 node1 上:

bash 复制代码
cd /opt
rpm -ivh elasticsearch-5.5.0.rpm
systemctl daemon-reload
systemctl enable elasticsearch.service

备份并修改主配置文件:

bash 复制代码
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
vim /etc/elasticsearch/elasticsearch.yml

关键配置:

yaml 复制代码
cluster.name: my-elk-cluster
node.name: node1
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"]

创建数据目录并授权:

bash 复制代码
mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data/

启动:

bash 复制代码
systemctl start elasticsearch.service
netstat -antp | grep 9200

node2 的操作完全一样,只需要把 node.name 改成 node2 即可。

3. 验证集群状态

浏览器打开:

复制代码
http://192.168.108.41:9200/_cluster/health?pretty

看到 "status" : "green" 且 number_of_nodes 为 2,就说明集群搭好了。


四、安装 elasticsearch-head 可视化插件

命令行看集群太不方便了,装个 head 插件图形化管理。

1. 编译安装 Node.js

bash 复制代码
yum install gcc gcc-c++ make -y
cd /opt
tar xzvf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure
make -j4
make install

⏱️ 编译过程大概 10 分钟,耐心等一下。

2. 安装 phantomjs

bash 复制代码
cd /usr/local/src/
tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64/bin
cp phantomjs /usr/local/bin

3. 安装 head 插件

bash 复制代码
cd /usr/local/src/
tar xzvf elasticsearch-head.tar.gz
cd elasticsearch-head/
npm install

4. 开启跨域支持

修改 elasticsearch.yml,末尾加两行:

yaml 复制代码
http.cors.enabled: true
http.cors.allow-origin: "*"

重启 ES:

bash 复制代码
systemctl restart elasticsearch

5. 启动 head

bash 复制代码
cd /usr/local/src/elasticsearch-head/
npm run start &

浏览器访问 http://192.168.108.41:9100,输入 ES 地址连接,看到集群健康值 green 就 OK 了。


五、部署 Logstash 收集日志

在 apache 节点(192.168.108.43)操作。

1. 安装 Apache 和 Logstash

bash 复制代码
yum -y install httpd
systemctl start httpd

rpm -ivh logstash-5.5.1.rpm
systemctl start logstash.service
systemctl enable logstash.service
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/

2. 测试 Logstash 基本功能

最简单的 stdin → stdout 测试:

bash 复制代码
logstash -e 'input { stdin{} } output { stdout{} }'

输入什么就输出什么,说明管道正常。

再试试用 rubydebug 格式输出详细信息:

bash 复制代码
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'

输出会变成 JSON 格式,包含时间戳、主机名等字段。

3. 对接 Elasticsearch

把日志直接写入 ES:

bash 复制代码
logstash -e 'input { stdin{} } output { elasticsearch { hosts=> ["192.168.108.41:9200"] } }'

输入几行内容后退出,去 head 插件里就能看到自动生成了 logstash-时间 的索引。

4. 配置采集系统日志

先给 messages 日志加读权限:

bash 复制代码
chmod o+r /var/log/messages

创建配置文件:

bash 复制代码
vim /etc/logstash/conf.d/system.conf

内容:

ruby 复制代码
input {
  file{
    path => "/var/log/messages"
    type => "system"
    start_position => "beginning"
  }
}

output {
  elasticsearch {
    hosts => ["192.168.108.41:9200"]
    index => "system-%{+YYYY.MM.dd}"
  }
}

重启生效:

bash 复制代码
systemctl restart logstash.service

六、安装 Kibana 可视化

在 node1 上操作。

1. 安装配置

bash 复制代码
cd /usr/local/src/
rpm -ivh kibana-5.5.1-x86_64.rpm
cd /etc/kibana/
cp kibana.yml kibana.yml.bak
vim kibana.yml

关键配置:

yaml 复制代码
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.108.41:9200"
kibana.index: ".kibana"

启动:

bash 复制代码
systemctl start kibana.service
systemctl enable kibana.service

浏览器访问 http://192.168.108.41:5601。

2. 创建索引模式

首次进入需要创建索引模式,输入 system-*,然后点 Create。

进入 Discover 页面,选择 host 和 message 字段,就能看到结构化的系统日志了。


七、对接 Apache 访问日志

回到 apache 节点,创建 Apache 日志采集配置:

bash 复制代码
vim /etc/logstash/conf.d/apache_log.conf

内容:

ruby 复制代码
input {
  file{
    path => "/var/log/httpd/access_log"
    type => "access"
    start_position => "beginning"
  }
  file{
    path => "/var/log/httpd/error_log"
    type => "error"
    start_position => "beginning"
  }
}

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

启动:

bash 复制代码
/usr/share/logstash/bin/logstash -f apache_log.conf

然后在 Kibana 里分别创建 apache_access-* 和 apache_error-* 的索引模式,就能直观看到 Apache 的访问日志和错误日志了。


八、总结

整套 ELK 搭下来,核心就四步:

  1. 搭 ES 集群 ------ 负责存储和搜索
  2. 装 head 插件 ------ 图形化管理 ES
  3. 配 Logstash ------ 采集日志写入 ES
  4. 装 Kibana ------ 可视化展示日志

📌 入门踩坑提醒:

  • ES 不能用 root 用户启动,一定要授权数据目录
  • head 插件必须开跨域,否则连不上 ES
  • Logstash 采集文件日志时,记得给日志文件加读权限
  • Kibana 首次使用必须先创建索引模式才能看到数据

这套架构虽然是 5.x 版本的老版本,但核心原理和流程和现在 7.x、8.x 是一致的。入门阶段先把原理跑通,后面升级版本就是改配置的事。


我是正在啃运维技术栈的学习者,持续记录 ELK、Zabbix、K8s 这些运维必备组件的实操踩坑,欢迎评论区交流~

相关推荐
逐流人1 天前
ELK企业级日志分析系统:从零搭建集中化日志平台
运维·elk·云原生·云计算·日志分析
你看我名字2 天前
ELK 日志分析平台:Filebeat、Logstash、Elasticsearch 与 Kibana 实战
大数据·elk·elasticsearch
SelectDB技术团队3 天前
云数仓成本结构拆解:五层计费模型与 Apache Doris 托管形态对照
大数据·数据库·elk·全文检索·snowflake
.冰块.5 天前
ELK 日志分析系统实验:部署 Elasticsearch 双节点集群实现 Apache 日志采集与 Kibana 可视化
elk·elasticsearch·apache·日志
AscendKing6 天前
可观测性选型:ELK vs SkyWalking,到底哪个更重?是二选一,还是两者一起部署?
elk·skywalking·apm·可观测
March.s7 天前
构建企业级 ELK 日志分析系统:从核心原理到集群化部署实战
elk
fengkai45457 天前
十四、ELK 企业日志分析系统
运维·elk·日志
Thomas.Sir7 天前
第28课:统一日志收集、ELK搭建 & 线上问题排查体系
elk·spring cloud
诚丞成14 天前
ELK日志分析:Elasticsearch索引、Logstash接入与Kibana可视化
elk·elasticsearch·jenkins