为什么你需要一个日志分析系统
上周三晚上十点,公司官网突然打不开。值班同事一边刷新页面一边打电话问:“哪个服务崩了?”没人知道。等翻完七八台服务器的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 分钟。省下的时间,够多写两个需求,或者准点下班喝杯咖啡。