一、日志分析概述:日志的价值、目标与常见格式
大家好,我是老赵。今天咱们聊聊日志分析这个事儿。
说实话,我干了十几年运维,见过太多系统崩在半夜的场景。每次出问题,第一反应就是——查日志。日志这东西,平时你可能觉得它占磁盘、没啥用,但真到了关键时刻,它就是你的救命稻草。
1.1 日志的价值——为什么我们要重视它?
日志的价值,说白了就三点:
- 故障定位:系统挂了,你总得知道为什么挂吧?日志就是现场记录。
- 安全审计:谁在什么时候干了什么,日志里一清二楚。
- 性能分析:接口慢了、数据库卡了,日志能帮你找到瓶颈。
我个人习惯:每接手一个新系统,第一件事就是搞清楚它的日志目录在哪、日志格式是什么。这比看什么架构图都管用。
我记得有一次,线上服务半夜突然飙高延迟。大家慌得不行,重启、扩容都试了,没用。最后我翻了翻 access log,发现某个接口的请求量突然暴增,而且参数里带了个奇怪的 user-agent。顺着这条线查下去,发现是爬虫在搞鬼。你看,日志不会骗人。
1.2 日志分析的目标——我们到底想从日志里得到什么?
你可能会问:日志那么多,我总不能一条一条看吧?
没错。日志分析的目标,其实就四个字:从数据中提取价值。具体来说:
- 实时监控:系统当前是否健康?有没有异常?
- 趋势分析:流量在涨还是跌?错误率在上升还是下降?
- 根因定位:出问题了,到底是代码的锅、网络的锅、还是配置的锅?
- 容量规划:根据历史数据,预测未来需要多少资源。
避坑指南:我曾经犯过一个错误——把所有日志都往一个文件里写。结果日志文件涨到几十个G,用 grep 查一次要等十分钟。后来我学乖了,按天、按模块拆分日志,配合日志轮转,这才算走上正轨。
1.3 常见日志格式——你得看得懂它们
做日志分析,首先得认识日志长什么样。我挑三个最常见的说说。
1.3.1 Apache 日志格式
Apache 的日志,默认是 Common Log Format (CLF)。长这样:
192.168.1.1 - - [10/Oct/2023:13:55:36 +0800] "GET /index.html HTTP/1.1" 200 2326
字段含义:
- 客户端 IP
- 身份标识(通常为 -)
- 用户名(通常为 -)
- 时间戳
- 请求行(方法 + 路径 + 协议)
- 状态码
- 响应体大小(字节)
如果你想要更多信息,可以用 Combined Log Format,它会在末尾加上 Referer 和 User-Agent:
192.168.1.1 - - [10/Oct/2023:13:55:36 +0800] "GET /index.html HTTP/1.1" 200 2326 "http://example.com" "Mozilla/5.0"
1.3.2 Nginx 日志格式
Nginx 的日志格式更灵活,可以自定义。默认的 combined 格式和 Apache 差不多,但实际生产中我建议你加一些字段:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$request_time $upstream_response_time';
嗯,这里要注意:$request_time 和 $upstream_response_time 这两个字段,对排查慢请求特别有用。我一般都会加上。
1.3.3 Syslog 格式
Syslog 是 Linux 系统日志的标准格式,主要用于系统级日志(如内核、服务、认证等)。
<34>Oct 10 13:55:36 myhost sshd[1234]: Failed password for root from 192.168.1.100 port 22 ssh2
字段含义:
<34>:优先级(设施 × 8 + 级别)- 时间戳
- 主机名
- 进程名和 PID
- 消息内容
注意:Syslog 的时间戳格式在不同系统上可能不一样。有的用 RFC 3164(旧格式),有的用 RFC 5424(新格式)。解析的时候一定要确认清楚,否则时间对不上,排查问题就麻烦了。
1.4 日志分析流程——从原始日志到 actionable insight
日志分析不是上来就写脚本。我总结了一个四步流程,你照着做基本不会跑偏。
核心流程:采集 → 解析 → 存储 → 分析
下面这张图可以帮你快速理解整个流程:
每个步骤具体做什么?
- 采集:把分散在各台机器上的日志收集到一起。工具方面,我个人推荐 Filebeat 或 Fluentd,轻量、稳定。
- 解析:把非结构化的文本转成结构化数据。比如用正则把 IP、时间、状态码提取出来。
- 存储:存到能快速查询的地方。小规模用 Elasticsearch,大规模用 ClickHouse。
- 分析:通过可视化工具(Kibana、Grafana)展示趋势、告警、异常。
我的经验:很多人一上来就想搞实时分析,其实没必要。先做好离线分析,把历史数据摸清楚,再考虑实时。步子迈大了容易扯着蛋。
1.5 小结
日志分析这件事,说难不难,说简单也不简单。关键在于:
- 你得知道日志里有什么(格式)
- 你得知道你要什么(目标)
- 你得知道怎么干(流程)
把这三点搞清楚了,剩下的就是工具和经验的积累。后面几章,我会带你一步步实操,从采集到展示,把整个链路跑通。