第三章:Linux日志系统——系统日志、内核日志、安全日志与登录日志

日志排查这件事,说白了就是跟系统“聊天”。你得知道它什么时候不高兴了,为什么闹脾气。我个人习惯,遇到问题第一件事就是翻日志。不是因为我懒,而是因为日志不会说谎。

这一章我们聊聊Linux的四大日志体系:系统日志、内核日志、安全日志、登录日志。嗯,这四块搞明白了,你排查问题的效率至少翻一倍。

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

系统日志是Linux最基础的“日记本”。几乎所有非内核、非认证类的消息,都会写到这里。

/var/log/messages 是Red Hat系(CentOS、RHEL、Fedora)的主力日志文件。它记录系统启动信息、服务启停、网络状态变化、硬件错误等。

/var/log/syslog 则是Debian系(Ubuntu、Debian)的对应文件。功能上跟messages几乎一样,只是名字不同。

核心区别速查表:

发行版家族 主系统日志文件 日志守护进程
Red Hat / CentOS / Fedora /var/log/messages rsyslog
Debian / Ubuntu /var/log/syslog rsyslog

我在项目中遇到过一件事:某台CentOS服务器突然网络不通,但ping自己没问题。我第一反应就是翻messages。果然,里面有一条“eth0: link down”的记录。原来是网线松了。你看,日志直接告诉你答案。

我的习惯:排查问题时,先看messages/syslog。如果这里没有线索,再去看其他日志。这就像看病先量体温一样,是最基础的检查。

3.2 内核日志:dmesg

dmesg是内核的“私密日记”。它记录的是内核环形缓冲区的内容,包括硬件检测、驱动加载、内存信息、磁盘I/O错误等。

为什么需要单独的内核日志?因为系统日志可能来不及记录内核的紧急消息。比如内核panic了,系统日志还没写进去,系统就挂了。但dmesg缓冲区里的内容还在。

# 查看所有内核日志
dmesg

# 实时监控内核日志(类似tail -f)
dmesg -w

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

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

# 清空内核日志(慎用!)
dmesg -c

实战场景:服务器突然重启,你怀疑是硬件问题。这时候messages里可能只有“shutdown”记录,但dmesg里可能有“CPU temperature exceeded threshold”这样的关键信息。我曾经排查过一台服务器频繁重启的问题,就是靠dmesg发现CPU风扇转速异常。

注意:dmesg缓冲区大小有限。如果系统运行时间很长,早期的内核日志会被覆盖。所以遇到内核相关的问题,要尽快查看dmesg。

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

安全日志记录的是“谁在什么时候、从哪里、用什么方式、尝试登录系统”。包括SSH登录、sudo提权、用户切换等操作。

这个文件在排查安全事件时特别重要。比如有人暴力破解SSH密码,secure日志里会留下一堆“Failed password”记录。

# 查看最近的登录失败记录
tail -100 /var/log/secure | grep "Failed password"

# 统计每个IP的失败次数
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr

# 查看sudo使用记录
grep "sudo" /var/log/secure

我曾经遇到过:客户说服务器被黑了,但找不到证据。我一看secure日志,发现有个IP在凌晨3点尝试了2000多次SSH登录。虽然最终没成功,但说明这台机器已经被盯上了。后来我们加了fail2ban,世界清净了。

安全日志的关键字段:

  • 时间戳:精确到秒
  • 主机名:哪台机器
  • 服务名:sshd、sudo、login等
  • 用户:尝试登录的用户名
  • 源IP:从哪里来的
  • 结果:Accepted(成功)或Failed(失败)

3.4 登录日志:lastlog、wtmp、btmp

这三个文件是二进制格式的,不能直接用cat或less查看。需要用专门的命令来读取。

文件 用途 查看命令
/var/log/lastlog 记录每个用户最近一次登录时间 lastlog
/var/log/wtmp 记录所有用户的登录/注销历史 last
/var/log/btmp 记录所有失败的登录尝试 lastb
# 查看所有用户最近一次登录
lastlog

# 只看某个用户
lastlog -u root

# 查看登录历史(包括重启记录)
last

# 查看失败登录记录
lastb

# 统计失败登录次数
lastb | awk '{print $3}' | sort | uniq -c | sort -nr

为什么要有三个文件?你想想看,lastlog只告诉你“最后一次”,但你想知道过去一周谁登录过,就得看wtmp。而btmp专门记录失败的尝试,方便你发现暴力破解行为。各司其职。

我的排查流程:

  1. 先看lastlog,确认哪些用户最近登录过
  2. 再用last查看详细登录历史
  3. 如果怀疑有暴力破解,用lastb看失败记录
  4. 最后去secure日志里找具体细节

3.5 知识体系总览

下面这张图帮你理清这四大日志的关系。我画图的时候习惯把“排查入口”放在中间,因为实际工作中你不可能同时看所有日志,得有个先后顺序。

Linux日志系统知识体系 排查入口 系统日志 /var/log/messages /var/log/syslog 内核日志 dmesg 内核环形缓冲区 安全日志 /var/log/secure SSH、sudo记录 登录日志 lastlog / wtmp / btmp last / lastb 命令 排查顺序:系统日志 → 安全日志 → 登录日志 → 内核日志 日志分析的核心:知道去哪里找,知道怎么看

3.6 实战小技巧

最后分享几个我常用的排查技巧:

  • 时间同步很重要:日志时间不准,排查起来会疯掉。我习惯先检查ntp状态。
  • 日志轮转:messages会按周轮转,变成messages-20240101这样的格式。别只看当前文件,历史文件里可能有线索。
  • grep -i 忽略大小写:有时候日志里是“error”,有时候是“Error”,加个-i参数省心。
  • journalctl:如果你用的是systemd的系统,journalctl可以同时查看所有日志。但我个人还是习惯直接看文件,感觉更踏实。

避坑指南:我曾经在排查问题时,发现messages日志突然变空了。后来才知道是有人手动执行了echo > /var/log/messages。嗯,这个操作会清空日志文件。所以,永远不要手动清空日志文件,用logrotate来管理。

好了,这一章的内容就到这里。日志系统是Linux运维的基石,你花时间搞懂它,以后排查问题会轻松很多。

可可精品资料库