第三章: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专门记录失败的尝试,方便你发现暴力破解行为。各司其职。
我的排查流程:
- 先看lastlog,确认哪些用户最近登录过
- 再用last查看详细登录历史
- 如果怀疑有暴力破解,用lastb看失败记录
- 最后去secure日志里找具体细节
3.5 知识体系总览
下面这张图帮你理清这四大日志的关系。我画图的时候习惯把“排查入口”放在中间,因为实际工作中你不可能同时看所有日志,得有个先后顺序。
3.6 实战小技巧
最后分享几个我常用的排查技巧:
- 时间同步很重要:日志时间不准,排查起来会疯掉。我习惯先检查ntp状态。
- 日志轮转:messages会按周轮转,变成messages-20240101这样的格式。别只看当前文件,历史文件里可能有线索。
- grep -i 忽略大小写:有时候日志里是“error”,有时候是“Error”,加个-i参数省心。
- journalctl:如果你用的是systemd的系统,journalctl可以同时查看所有日志。但我个人还是习惯直接看文件,感觉更踏实。
避坑指南:我曾经在排查问题时,发现messages日志突然变空了。后来才知道是有人手动执行了echo > /var/log/messages。嗯,这个操作会清空日志文件。所以,永远不要手动清空日志文件,用logrotate来管理。
好了,这一章的内容就到这里。日志系统是Linux运维的基石,你花时间搞懂它,以后排查问题会轻松很多。