公司服务器凌晨突然宕机,运维小李接到报警后一头雾水。查了半小时系统状态,却找不到关键线索。最后发现是一条被忽略的数据库连接异常日志,连续出现了几百次,但分散在十几台机器的日志文件里——这就是典型的日志管理缺失。
为什么日志总是管不好?
很多中小企业的IT部门还在用老办法:每台服务器自己记日志,出问题时手动登录上去翻文件。开发说“我这边没问题”,运维说“应用没报错”,安全团队想要审计数据却无从下手。日志散落在各处,格式不统一,保留时间短,出了事只能靠人肉拼凑时间线。
我们是怎么改的?
三个月前,我们技术部下决心重建日志体系。第一步不是买工具,而是先列清楚需求:运维需要实时告警,开发要方便查错,安全合规要求保留180天以上,管理层希望看到系统健康报表。
基于这些,选型时重点看了ELK(Elasticsearch + Logstash + Kibana)和轻量级替代方案Loki。最终选择了Loki,因为资源消耗低,集成快,而且跟现有的Prometheus监控天然搭配。
部署结构长这样:
应用服务 -> 日志采集器(Promtail) -> Loki存储 -> Grafana展示
所有服务统一用JSON格式输出日志,包含timestamp、level、service_name、trace_id等字段。比如一个API请求的日志看起来是:
{"timestamp": "2024-04-05T10:23:15Z", "level": "error", "service_name": "user-api", "msg": "failed to fetch user profile", "user_id": 10086, "trace_id": "abc123xyz"}
几个实用技巧
一开始大家抱怨查询语法难上手。后来做了个内部小文档,把常用查询做成模板。比如查某个用户的操作记录:
{service_name="user-api"} |= `user_id=10086`
再比如筛选所有错误级别日志:
{job="app-logs"} |~ `"level": "error"`
还设置了自动归档策略,热数据放SSD,超过30天的移到低成本存储。既满足合规,又控制成本。
现在出了问题怎么处理?
上周支付接口响应变慢。运维在Grafana面板一眼看出错误率上升,点进去直接跳转到对应时间段的日志流,发现是第三方证书即将过期。从发现问题到定位原因,不到十分钟。
开发也省事了。以前用户投诉“提交失败”,得问时间、问操作步骤。现在只要用户提供手机号,用trace_id一串就能把整个请求链路的日志全捞出来。
别忽视权限和安全
日志里可能含敏感信息。我们在采集层就做了一层过滤,自动脱敏手机号、身份证号。不同团队只能看自己服务的日志,HR系统日志连运维都打不开。
现在每天早上9点,各系统负责人会收到一封摘要邮件,列出过去24小时的关键错误和趋势变化。不再是被动救火,而是提前发现问题苗头。