日志是操作系统最真实的“黑匣子”,无论是系统故障、服务崩溃,还是内核异常,日志都是我们定位问题的第一入口。本篇文章将带你完整解析 Linux 系统日志体系,深入讲解日志存储结构、记录机制、核心组件、内核日志来源,并教你如何精准定位某一事件的日志记录。
一、Linux 日志系统整体架构
Linux 的日志体系由多个层级组成,不同级别负责记录不同类别的信息:
- 内核日志(Kernel Log)
- 系统日志(Syslog / rsyslog / journald)
- 应用日志(如 Apache、Nginx、Docker 等)
- 用户级日志(crontab、登录历史等)
日志的写入、转发和保存依赖多个服务组件,如 rsyslogd
、systemd-journald
、logrotate
等。
二、日志存放路径详解(以 CentOS、Ubuntu 为主)
常见路径列表:
路径 | 说明 | 适用系统 |
---|---|---|
/var/log/messages | 通用系统日志(大部分服务信息) | CentOS / RHEL |
/var/log/syslog | 系统信息(除安全认证) | Ubuntu / Debian |
/var/log/kern.log | 内核相关日志 | Ubuntu |
/var/log/dmesg | 启动时的内核缓冲区日志 | 所有 |
/var/log/secure | 安全认证、SSH 日志 | CentOS / RHEL |
/var/log/auth.log | 登录认证信息 | Ubuntu |
/var/log/journal/ | systemd 二进制日志存储位置 | 所有启用 systemd 的系统 |
/var/log/httpd/ 、/var/log/nginx/ | Web 服务器日志 | 按需部署 |
/var/log/audit/audit.log | SELinux 审计日志 | SELinux 启用系统 |
三、日志分类与关键内容示例
1. 系统日志 /var/log/messages
示例
Oct 2 10:52:31 hostname kernel: usb 1-1: new full-speed USB device number 2 using xhci_hcd
Oct 2 10:52:31 hostname systemd: Starting udev Coldplug all Devices...
- 来源:
rsyslog
默认写入 - 包括:内核信息、服务信息、硬件变动等
2. 内核日志 /var/log/kern.log
示例
[ 2.334324] i915 0000:00:02.0: [drm] Initialized i915 1.6.0 20191017
- 纯内核日志,更适合调试内核模块
- 可配合
dmesg
使用查看实时日志
3. 审计日志 /var/log/audit/audit.log
示例
type=USER_LOGIN msg=audit(1649351803.691:450): pid=1234 uid=0 auid=1000 ses=5 msg='op=login id=1000 exe="/usr/sbin/sshd" ...
- 包括:SSH 登录、用户认证等详细信息
- 适用于安全分析、合规审计
四、内核日志来源详解
Linux 内核通过 printk()
函数输出日志,等级从紧急(0)到调试(7):
等级 | 宏定义 | 含义 |
---|---|---|
0 | KERN_EMERG | 紧急,如系统崩溃 |
1 | KERN_ALERT | 需立即处理的问题 |
2 | KERN_CRIT | 严重错误 |
3 | KERN_ERR | 普通错误 |
4 | KERN_WARNING | 警告 |
5 | KERN_NOTICE | 正常但重要 |
6 | KERN_INFO | 普通信息 |
7 | KERN_DEBUG | 调试级信息 |
查看内核日志的几种方式:
dmesg # 查看启动期间内核日志(缓冲区)
journalctl -k # 显示所有内核相关日志(systemd)
cat /var/log/kern.log # 查看历史内核日志(需配置)
五、日志系统服务详解
1. rsyslog 服务
- 配置文件:
/etc/rsyslog.conf
- 功能:将日志写入文件或发送到远程服务器
- 日志级别过滤机制如下:
kern.* /var/log/kern.log
authpriv.* /var/log/secure
*.info;mail.none;authpriv.none;cron.none /var/log/messages
2. systemd-journald
- 配置文件:
/etc/systemd/journald.conf
- 日志持久化设置:
[Journal]
Storage=persistent # 否则日志只在内存中
- 查询命令:
journalctl -u nginx.service
journalctl -b # 当前启动日志
journalctl -p err # 查看错误级别日志
六、精确定位日志事件的方法
示例一:查找 USB 插入设备的日志
journalctl -k | grep usb
dmesg | grep -i usb
示例二:查找某时间段内所有服务日志
journalctl --since "2025-04-01 10:00" --until "2025-04-01 12:00"
示例三:查找特定服务日志(如 sshd)
journalctl -u sshd
grep sshd /var/log/secure
示例四:查看某个用户登录信息
last -a # 登录历史
lastlog # 所有用户上次登录时间
七、日志轮转与日志爆炸控制
使用 logrotate
- 主配置文件:
/etc/logrotate.conf
- 各服务配置:
/etc/logrotate.d/
示例:
/var/log/secure {
rotate 7
daily
missingok
notifempty
compress
postrotate
/bin/kill -HUP $(pidof rsyslogd)
endscript
}
日志压缩与清理
logrotate -f /etc/logrotate.conf # 强制轮转
du -sh /var/log # 检查日志占用
八、进阶技巧:导出日志用于分析
journalctl > full-log.txt
journalctl -u nginx.service > nginx-log.txt
结合工具 grep
、awk
、sed
可快速提取关键信息,适合写脚本或日志告警系统。
九、总结与建议
- 内核相关问题优先查看
dmesg
和journalctl -k
- 服务启动失败先查
journalctl -u 服务名
- 登录、安全问题查
/var/log/secure
或/var/log/auth.log
- 配置
logrotate
,避免磁盘被日志撑满 - 在大规模系统中可启用远程日志收集(rsyslog + ELK)