1. 日志采集概述:为什么需要日志采集?
说实话,我见过太多团队把日志当成「后花园」——想起来就写点,想不起来就拉倒。直到线上出了故障,一群人抓瞎,才意识到日志的重要性。
日志采集,说白了就是把你系统里发生的事,有结构、有顺序、可检索地记录下来。它不是锦上添花,而是基础设施。
一句话总结:没有日志采集的系统,就像没有黑匣子的飞机——飞得再高,出了事也查不出原因。
1.1 为什么非做不可?
我入行头两年,在一家创业公司做后端。有一次凌晨两点,用户量突然暴涨,服务全挂了。我们几个开发对着屏幕干瞪眼——代码里只有零星几个 console.log,连错误栈都没打全。那晚我们花了整整 6 个小时才定位到问题:一个连接池泄漏。
从那以后,我给自己定了个规矩:任何上线的服务,日志必须到位。原因有三点:
- 系统太复杂,肉眼看不透——微服务、容器、分布式,调用链动不动跨十几个节点。没有日志,你根本不知道数据流在哪断了。
- 故障恢复需要「回放」——出问题时现场早没了。日志是你唯一能倒带重看的东西。
- 合规要求越来越严——GDPR、等保、金融审计,哪个不要求留痕?
我的习惯:新项目启动时,第一件事不是写业务代码,而是搭日志采集管道。先把「眼睛」装上,再干活。
1.2 三大核心目标
日志采集不是「记了就完事」。你得想清楚:记这些日志到底为了什么?我个人把它拆成三个维度。
1.2.1 可观测性(Observability)
可观测性这个词最近很火。但别被概念绕晕了——它要解决的就是一个问题:系统现在到底在干嘛?
我习惯把可观测性比作汽车的仪表盘。你开车时不会等发动机冒烟了才知道有问题,而是看转速表、水温表、油量表来实时判断。日志就是系统的「仪表盘数据」。
具体来说,日志在可观测性里扮演三个角色:
- Metrics 的补充——指标告诉你「CPU 飙到 90% 了」,日志告诉你「是哪个接口导致的」。
- Tracing 的锚点——链路追踪告诉你请求经过了哪些服务,日志告诉你每个服务里具体发生了什么。
- 健康状态的晴雨表——错误率、延迟分布、慢查询,都能从日志里聚合出来。
注意:可观测性不是「日志越多越好」。我见过有人把每个循环里的变量都打出来,结果一天产生几十 TB 数据,查询慢得像蜗牛。日志要有目的性,不是流水账。
1.2.2 故障排查(Troubleshooting)
这是日志最原始、也最核心的用途。系统出问题了,你第一反应是什么?我猜是「翻日志」。
但「翻日志」和「高效排查」之间,差着十万八千里。我曾经接手过一个遗留系统,日志全打在一个文件里,没有时间戳、没有级别、没有请求 ID。出问题时,几个开发一起 grep,像大海捞针。
好的故障排查日志,应该满足三个条件:
- 可关联——每条日志带上 traceId、requestId,能把一次请求的所有日志串起来。
- 有上下文——不光说「出错了」,还要说「谁调了哪个接口、传了什么参数、在哪一步挂的」。
- 分级别——ERROR 是真正的问题,WARN 是潜在风险,INFO 是正常流程。别把 INFO 当 DEBUG 用。
// 反面案例
log.info("用户登录失败");
// 正面案例
log.warn("用户登录失败 | userId={} | ip={} | reason={}",
userId, clientIp, "密码错误超过5次");
我的经验:每次写日志时,问自己一句——「如果明天线上出问题,我看到这条日志能定位到原因吗?」不能?那就重写。
1.2.3 安全审计(Security Audit)
安全审计这块,很多人觉得「跟我没关系,那是安全团队的事」。但真出了安全事件,第一个被问责的往往是研发——「为什么没记录谁访问了敏感数据?」
我经历过一次内部审计,对方要求提供过去 90 天所有管理员操作记录。幸好我们当时做了操作日志采集,不然真没法交代。
安全审计日志的核心要求:
- 不可篡改——日志一旦写入,就不能被修改或删除。至少要有 append-only 的保障。
- 完整记录——谁(Who)、什么时间(When)、从哪(Where)、做了什么(What)、结果如何(Result)。
- 长期保存——审计日志的保留周期通常以年为单位,不是几天。
| 审计要素 | 日志字段示例 | 说明 |
|---|---|---|
| Who | userId, role, sessionId | 谁发起的操作 |
| When | timestamp (精确到毫秒) | 操作发生的时间点 |
| Where | clientIp, serverIp, region | 从哪来、到哪去 |
| What | action, resource, params | 具体做了什么 |
| Result | statusCode, errorMsg | 成功还是失败 |
1.3 三大目标的关系
这三个目标不是孤立的。它们像三根柱子,撑起了一个可靠的日志体系。
我画了张图,帮你理清它们之间的关系:
你看,日志采集在最底层,支撑着上面三个目标。而这三个目标最终都指向同一个方向——让系统更可靠,让业务更稳定。
1.4 避坑指南:新手最容易犯的错
讲了这么多理论,来点实际的。我总结了几条新手常踩的坑:
- 坑一:日志打得太随意——想到哪打到哪,没有统一格式。结果就是没法解析、没法聚合。
- 坑二:只打 ERROR,不打 INFO——出问题时没有上下文,光看 ERROR 根本不知道前因后果。
- 坑三:日志不轮转——一个文件写到几十 GB,服务器磁盘直接打满。嗯,我当年就干过这事。
- 坑四:敏感信息不打码——把用户密码、身份证号直接打出来,审计来了直接凉凉。
我曾经踩过的坑:有一次把 DEBUG 级别的日志直接打到生产环境,结果一天产生了 2TB 数据,ELK 集群直接被打挂。从那以后,我强制要求所有服务必须用日志级别动态调整——线上只开 INFO 以上,需要排查时再临时开 DEBUG。
好了,这一章就聊到这。日志采集不是「写几行代码就完事」的活,它需要你从一开始就想清楚:为什么记、记什么、怎么用。后面我们会一步步深入,把每个环节的坑都给你填平。