手把手搭建日志分析系统:运维人的实战指南

为什么你需要一个日志分析系统

上周三晚上十点,公司官网突然打不开。值班同事一边刷新页面一边打电话问:“哪个服务崩了?”没人知道。等翻完七八台服务器的log文件,两个钟头过去了——问题其实出在数据库连接池耗尽,但日志散落在不同机器上,根本没法快速定位。

这事儿之后,我们决定搞个统一的日志分析系统。不是为了高大上,而是真的被折腾怕了。

技术选型:ELK 还是轻量级方案?

很多人一上来就推ELK(Elasticsearch + Logstash + Kibana),功能强,但也重。小团队或者测试环境,跑一套ELK可能还没配好,硬盘先满了。

我们用的是轻量组合:Filebeat 收集日志,写入 Loki,前端用 Grafana 查看。资源占用低,部署快,关键是和现有监控体系能无缝对接。

安装与配置步骤

第一步,在每台应用服务器安装 Filebeat:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list
sudo apt-get update && sudo apt-get install filebeat

第二步,修改 filebeat.yml,指向 Loki 服务地址:

output.http:
  enabled: true
  url: http://loki-server:3100/loki/api/v1/push
  headers:
    Content-Type: application/json

第三步,启动 Filebeat:

sudo systemctl enable filebeat
sudo systemctl start filebeat

查看日志:Grafana 上的操作

进 Grafana 面板,添加 Loki 数据源,URL 填 http://localhost:3100。保存后点“Explore”,就能看到所有收集过来的日志流。

比如查某个用户登录失败的记录,直接在查询框输入:

{job="nginx-access"} |= "POST /login" |~ "401"

一秒出结果,还能按时间下钻。再也不用 ssh 登五台服务器 grep 日志了。

实际场景:一次故障排查复盘

上个月支付接口偶发超时。开发说接口没问题,运维说网络稳定。最后我们在 Grafana 里用日志+监控图叠加分析,发现是某台 Redis 实例 CPU 突增时段,刚好匹配超时时间点。进一步查 Redis 慢查询日志,定位到一个没加索引的 keys * 操作。

整个过程从发现问题到修复不到四十分钟。要是以前靠人工翻日志,估计又得熬夜。

几点经验分享

别等出事才想起日志。我们现在的做法是每天早上晨会前,固定看一眼关键服务的日志异常关键词,比如 "timeout"、"connection refused"。发现苗头就处理。

另外,日志格式尽量统一。Nginx 用 JSON 格式输出,Java 应用加上 traceId,方便链路追踪。不然一堆 unparseable log 堆着,再好的系统也白搭。

这套系统上线三个月,线上问题平均响应时间从 92 分钟降到 23 分钟。省下的时间,够多写两个需求,或者准点下班喝杯咖啡。