2、异常排查基础:日志系统概述、核心日志文件介绍、日志级别与分类
做运维这些年,我有个习惯——遇到问题先看日志。说白了,日志就是系统的「黑匣子」。飞机失事要找黑匣子,服务器出问题,日志就是我们的第一现场。
你想想看,一个系统跑得好好的,突然挂了。你慌不慌?别慌。先问自己三个问题:什么时候发生的?什么模块报的?错误码是什么?这三个答案,日志里全都有。
2.1 日志系统概述
日志系统,说白了就是记录程序运行时「发生了什么」的机制。它不只是报错,还包括谁在什么时候做了什么操作、系统资源用了多少、网络请求是成功还是失败。
我在项目中遇到过这么一件事:某天凌晨三点,线上告警说支付接口超时。我登录服务器,第一件事就是翻日志。结果发现,日志里记录了「数据库连接池耗尽」的警告,但这条警告被淹没在几千行 INFO 级别的调试日志里了。嗯,这就是典型的日志级别设置不当。
核心观点:日志不是越多越好,也不是越少越好。关键是要在「能复现问题」和「不影响性能」之间找到平衡点。
一个成熟的日志系统,通常包含三个角色:
- 日志生产者——应用程序、系统服务、内核模块
- 日志收集器——rsyslog、systemd-journald、Filebeat 等
- 日志消费者——运维人员、监控系统、审计系统
这三者缺一不可。生产者不写日志,你啥也查不到;收集器没配好,日志丢了;消费者不会看,日志白写。
2.2 核心日志文件介绍
Linux 系统里,日志文件主要集中在 /var/log/ 目录下。我每次排查问题,都会先扫一眼这个目录。下面这几个文件,你必须记住:
| 日志文件 | 用途 | 我常用的场景 |
|---|---|---|
/var/log/messages |
通用系统日志,记录内核及大部分系统服务信息 | 系统启动异常、服务崩溃 |
/var/log/secure |
安全认证日志,SSH 登录、sudo 操作都在这里 | 排查暴力破解、权限问题 |
/var/log/cron |
计划任务执行日志 | 定时任务没跑、跑失败了 |
/var/log/dmesg |
内核环缓冲区日志,硬件驱动相关 | 新加硬件不识别、OOM Killer |
/var/log/maillog |
邮件服务日志 | 邮件发不出去、被拒收 |
/var/log/boot.log |
系统启动日志 | 启动卡在某一步 |
我的小技巧:排查问题时,别只盯着一个日志文件。比如 SSH 连不上,既要看 /var/log/secure,也要看 /var/log/messages。前者告诉你「谁在尝试登录」,后者告诉你「网络服务是不是正常启动了」。
我曾经遇到过一个案例:用户反馈 SSH 连不上服务器。我查 /var/log/secure,发现没有任何登录失败的记录。再查 /var/log/messages,发现 sshd 服务根本没启动。原来是系统升级后,sshd 的启动脚本被覆盖了。你看,只看一个日志,永远找不到真相。
2.3 日志级别与分类
日志级别,就是给日志打标签。从「调试信息」到「致命错误」,一共 8 个级别。我习惯把它们分成三档:
- 调试档:DEBUG、INFO——开发阶段用,线上环境建议关掉或只保留最近一小时
- 告警档:WARNING、ERROR——线上重点关注,WARNING 是「可能要出事」,ERROR 是「已经出事了」
- 致命档:CRITICAL、ALERT、EMERGENCY——立刻处理,系统快挂了或已经挂了
为什么会这样分?因为线上环境日志量巨大。你想想看,一个日活百万的系统,每秒可能产生几千条日志。如果全部记录 DEBUG 级别,磁盘很快就写满了,而且真正的问题会被淹没。
下面这张图,是我自己总结的日志级别金字塔:
我个人建议,线上环境至少把日志级别设为 WARNING 及以上。INFO 级别的日志可以保留,但要做好日志轮转,避免磁盘写满。DEBUG 级别,只在排查问题时临时开启,排查完立刻关掉。
注意:千万不要在生产环境长期开启 DEBUG 日志。我曾经接手过一个项目,前任运维把日志级别设成了 DEBUG,结果一个月后磁盘满了,系统直接宕机。恢复数据花了整整两天。
2.4 日志分类方式
除了按级别分,日志还可以按来源和用途分类。我一般这么分:
- 系统日志:内核、系统服务、硬件驱动产生的日志。比如
/var/log/messages、/var/log/dmesg - 应用日志:业务程序自己写的日志。比如 Nginx 的
access.log、error.log,Java 应用的catalina.out - 安全日志:认证、授权、审计相关的日志。比如
/var/log/secure、/var/log/audit/audit.log - 操作日志:记录管理员执行过的命令。比如
history命令的输出,或者 sudo 的日志
为什么要分类?因为不同的问题,查不同的日志。系统崩溃了,先看系统日志;业务报错了,先看应用日志;怀疑被入侵了,先看安全日志。分类清晰,排查效率才能高。
嗯,这里要注意:很多新手喜欢把所有日志混在一起看。结果就是,一条 ERROR 级别的业务报错,被几百条 INFO 级别的系统心跳日志给淹没了。我建议你养成习惯——先按分类定位问题范围,再按级别缩小搜索范围。
我的排查口诀:先分类,后分级;先看致命,再看告警;INFO 和 DEBUG,非必要不关注。
最后说一句:日志是你和系统对话的桥梁。系统不会说话,但它会把所有问题都写在日志里。你读懂了,问题就解决了一半。