3、Linux日志体系:系统日志、安全日志、内核日志

聊到Linux排障,日志就是我们的第一手现场证据。很多新手一上来就翻各种配置文件,其实我个人的习惯是——先看日志。日志不会骗人,它只会忠实地记录系统里发生了什么。

今天咱们就聚焦三个最核心的日志文件:/var/log/messages/var/log/secure,还有内核日志dmesg。搞懂这三个,日常排查80%的问题你都能搞定。

3.1 系统日志:/var/log/messages

这个文件可以说是Linux的“万能日记本”。几乎所有非内核、非安全认证的通用系统消息,都会往这里写。比如服务启动失败、网络接口状态变化、磁盘挂载报错等等。

它的典型格式长这样:

Mar 15 10:23:45 webserver systemd[1]: Starting Nginx Web Server...
Mar 15 10:23:46 webserver nginx[1234]: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Mar 15 10:23:46 webserver systemd[1]: nginx.service: Control process exited, code=exited status=1

你看,时间、主机名、进程名、具体错误信息,一目了然。我曾经遇到一个线上Nginx反复重启的问题,查了半天配置没发现问题,最后就是在这个日志里看到“Address already in use”,才发现是另一个服务占用了80端口。

排查要点:

  • 关注时间戳:先确认问题发生的时间段,缩小范围
  • 关注进程名:比如sshd、nginx、crond,快速定位是哪个服务出问题
  • 关注错误码:比如exit status 1、Permission denied,这些是核心线索

我的小技巧:tail -f /var/log/messages 实时跟踪日志输出。当你复现问题时,新日志会立刻刷出来,比事后翻找高效得多。

3.2 安全日志:/var/log/secure

这个文件专门记录用户认证相关的信息。说白了,谁登录了系统、谁登录失败了、谁用了sudo,全记在这里。安全审计和入侵排查,第一个就要翻它。

看看常见的登录失败记录:

Mar 15 03:12:08 webserver sshd[2345]: Failed password for root from 192.168.1.100 port 54321 ssh2
Mar 15 03:12:10 webserver sshd[2345]: Failed password for root from 192.168.1.100 port 54322 ssh2
Mar 15 03:12:12 webserver sshd[2345]: Failed password for root from 192.168.1.100 port 54323 ssh2

嗯,这里要注意。如果你看到短时间内大量“Failed password”记录,而且来自同一个IP,那基本可以断定有人在暴力破解你的SSH。我曾经接手过一个被攻陷的服务器,翻看/var/log/secure,发现攻击者连续尝试了三千多次密码,最后用弱口令登进去了。从那以后,我养成了一个习惯——所有服务器必须开启SSH密钥登录,禁用密码登录。

安全日志里还有一类重要记录:

Mar 15 09:00:01 webserver sudo:   zhangsan : TTY=pts/0 ; PWD=/home/zhangsan ; USER=root ; COMMAND=/bin/systemctl restart nginx

这条记录告诉你,用户zhangsan在什么时间、什么终端、用什么命令切换到了root权限。如果发现非授权用户执行了敏感命令,这就是铁证。

避坑指南: 我曾经遇到过日志被清空的情况。攻击者得手后第一件事就是清空/var/log/secure。所以建议把安全日志实时发送到远程日志服务器,或者用auditd做更细粒度的审计。本地日志不可全信。

3.3 内核日志:dmesg

dmesg和前面两个不一样。它不写文件,而是读取内核环缓冲区里的消息。硬件检测、驱动加载、磁盘错误、内存问题,这些底层信息都靠它。

用法很简单:

# 查看所有内核日志
dmesg

# 实时跟踪内核日志
dmesg -w

# 只看最后20条
dmesg | tail -20

# 搜索磁盘相关
dmesg | grep -i sda

举个例子,服务器突然重启了,你怀疑是硬件问题。这时候dmesg就是你的第一选择。看看有没有类似这样的记录:

[12345.678901] EDAC MC0: UE memory error on CPU0 channel0 slot0
[12345.678902] mce: [Hardware Error]: Machine check events logged

看到“UE memory error”或者“Machine check”,基本可以断定是内存故障。我有一台数据库服务器,隔三差五就宕机,查了应用日志、系统日志都没发现问题。最后用dmesg一看,内存报错已经持续好几天了。换了内存条,问题彻底解决。

dmesg里常见的几类信息:

信息类型 关键词 含义
硬件检测 sda、nvme、eth0 磁盘、网卡等设备被识别
驱动加载 driver、module 内核模块加载成功或失败
错误告警 error、failed、Oops 硬件或驱动层面的严重问题
内存错误 EDAC、MCE、memory error 物理内存故障

我的习惯: 服务器上架后,第一件事就是跑一遍dmesg | grep -i error,看看有没有硬件层面的隐患。很多问题在出厂时就埋下了,早发现早处理。

3.4 三个日志怎么配合使用?

你想想看,一个故障往往不是单一日志能说清楚的。我一般按这个顺序排查:

  1. 先看/var/log/messages:了解系统层面发生了什么,服务有没有异常退出
  2. 再看dmesg:如果怀疑是硬件或驱动问题,这里能找到底层证据
  3. 最后翻/var/log/secure:如果涉及权限、登录、安全事件,这里是最权威的

举个例子,SSH连不上服务器。先看messages,可能看到sshd启动失败;再看secure,可能看到大量认证失败;如果还不行,dmesg里可能显示网卡驱动报错。三个日志一交叉,问题基本就锁定了。

总结一下:

  • /var/log/messages:通用系统日志,排查服务问题首选
  • /var/log/secure:安全认证日志,审计和入侵排查必看
  • dmesg:内核日志,硬件和驱动问题靠它

这三个文件,是Linux排障的“铁三角”。搞懂了它们,你就有了从应用层到内核层的完整视野。