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 级别,磁盘很快就写满了,而且真正的问题会被淹没。

下面这张图,是我自己总结的日志级别金字塔:

日志级别金字塔 EMERGENCY(紧急) ALERT(警报) CRITICAL(严重) ERROR(错误) WARNING(警告) NOTICE(通知) INFO(信息) 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,非必要不关注。

最后说一句:日志是你和系统对话的桥梁。系统不会说话,但它会把所有问题都写在日志里。你读懂了,问题就解决了一半。