从零搭建 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 搭下来,核心就四步:
- 搭 ES 集群 ------ 负责存储和搜索
- 装 head 插件 ------ 图形化管理 ES
- 配 Logstash ------ 采集日志写入 ES
- 装 Kibana ------ 可视化展示日志
📌 入门踩坑提醒:
- ES 不能用 root 用户启动,一定要授权数据目录
- head 插件必须开跨域,否则连不上 ES
- Logstash 采集文件日志时,记得给日志文件加读权限
- Kibana 首次使用必须先创建索引模式才能看到数据
这套架构虽然是 5.x 版本的老版本,但核心原理和流程和现在 7.x、8.x 是一致的。入门阶段先把原理跑通,后面升级版本就是改配置的事。
我是正在啃运维技术栈的学习者,持续记录 ELK、Zabbix、K8s 这些运维必备组件的实操踩坑,欢迎评论区交流~