服务器日志集中收集,ELK搭建日志分析平台
服务器日志分散在各台机器上,排查问题时需要逐台登录,效率很低。
ELK 是 Elasticsearch、Logstash、Kibana 三个开源组件的组合,用来集中收集、存储和可视化日志。
下面从零开始,用一台 Linux 服务器搭建一套可用的日志分析平台,最终能通过浏览器搜索到多台服务器的日志。
准备环境与安装组件
先确认服务器配置:建议内存不低于 4GB,Elasticsearch 对内存较敏感。
操作系统以 Ubuntu 22.04 或 CentOS 7 为例,需要 root 或 sudo 权限。
安装 Java 运行环境,Elasticsearch 和 Logstash 依赖 JDK:
# Ubuntu/Debian
sudo apt update
sudo apt install openjdk-11-jdk -y
# CentOS/RHEL
sudo yum install java-11-openjdk -y
验证 Java 版本:
java -version
添加 Elastic 官方软件源并安装 Elasticsearch、Logstash、Kibana:
# 导入 GPG 密钥
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
# 添加源(Ubuntu 示例,CentOS 请替换为 yum 源)
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
sudo apt update
sudo apt install elasticsearch logstash kibana -y
安装完成后,三个服务的配置文件分别在:
- Elasticsearch:
/etc/elasticsearch/elasticsearch.yml - Logstash:
/etc/logstash/logstash.yml和/etc/logstash/conf.d/ - Kibana:
/etc/kibana/kibana.yml
配置 Elasticsearch 与 Kibana
修改 Elasticsearch 监听地址和端口,允许本机或内网访问:
# /etc/elasticsearch/elasticsearch.yml
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
启动并设置开机自启:
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
检查是否启动成功:
curl -X GET "localhost:9200"
返回包含 "cluster_name" 和 "version" 的 JSON 即表示正常。
接着配置 Kibana,指定 Elasticsearch 地址:
# /etc/kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
启动 Kibana:
sudo systemctl enable kibana
sudo systemctl start kibana
浏览器访问 http://服务器IP:5601,能看到 Kibana 界面说明配置成功。
用 Logstash 接收并解析日志
Logstash 负责把采集到的日志写入 Elasticsearch。
在 /etc/logstash/conf.d/ 下新建配置文件,例如 logstash.conf:
input {
beats {
port => 5044
}
}
filter {
# 如果日志是 JSON 格式可省略 grok,普通文本可用 grok 解析
# 示例:解析常见时间戳和日志级别
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:log_time} %{LOGLEVEL:level} %{GREEDYDATA:msg}" }
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "server-logs-%{+YYYY.MM.dd}"
}
}
启动 Logstash:
sudo systemctl enable logstash
sudo systemctl start logstash
查看日志确认无报错:
sudo tail -f /var/log/logstash/logstash-plain.log
在业务服务器部署 Filebeat 采集日志
Filebeat 是轻量级日志采集器,安装在需要收集日志的服务器上。
同样添加 Elastic 源后安装:
sudo apt install filebeat -y
编辑 Filebeat 配置,指定要采集的日志路径和输出到 Logstash:
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
output.logstash:
hosts: ["LOGSTASH_SERVER_IP:5044"]
把 LOGSTASH_SERVER_IP 替换为实际 ELK 服务器 IP。
启动 Filebeat:
sudo systemctl enable filebeat
sudo systemctl start filebeat
如果有多个业务服务器,重复这一步即可。
避开这些常见坑
- 内存不足:Elasticsearch 默认堆内存 1GB,如果服务器内存小,需修改
/etc/elasticsearch/jvm.options中的-Xms和-Xmx,建议不超过物理内存一半。 - 端口未放行:确认防火墙或安全组放行了 9200、5601、5044 端口,否则 Kibana 无法访问或 Filebeat 连不上 Logstash。
- Filebeat 无数据:检查 Filebeat 日志
/var/log/filebeat/filebeat,常见原因是路径不对或权限不足,确保 Filebeat 用户对日志文件有读权限。 - 索引不生成:Logstash 配置中的
index名称不要包含大写字母,Elasticsearch 要求索引名小写。 - Kibana 报错无法连接:确认 Kibana 配置中的
elasticsearch.hosts地址正确,且 Elasticsearch 已启动。
验证日志是否集中收集成功
在 Kibana 左侧菜单进入 Stack Management,
选择 Index Patterns,
创建索引模式,
例如 server-logs-*,
时间字段选择 @timestamp。
然后打开 Discover 页面,选择刚创建的索引模式,如果能看到来自不同服务器的日志记录,并且可以按时间、关键词搜索,说明日志集中收集已经生效。
如果没有数据,先检查 Filebeat 是否在业务服务器上正常运行,再检查 Logstash 日志是否有解析错误。
常见疑问
ELK 能否只装 Elasticsearch 和 Kibana,不用 Logstash?
可以,Filebeat 支持直接输出到 Elasticsearch,但缺少 Logstash 的过滤和解析能力,适合日志格式简单的场景。
日志量大了怎么办?
可以通过调整 Elasticsearch 分片、增加节点或使用索引生命周期管理(ILM)来优化,建议参考官方文档根据实际量调整。
Filebeat 和 Logstash 的区别是什么?
Filebeat 是轻量采集器,部署在业务服务器;Logstash 是重量级处理管道,负责解析和转发,两者常配合使用。
按照以上步骤,你就能搭建起一套基础的服务器日志集中收集与 ELK 日志分析平台。
遇到异常时优先检查各组件日志和端口连通性,再根据报错信息调整配置。