两套日志系统并存
传统 syslog(文本文件) /var/log/*.log
systemd journal(结构化) journalctl 查询
现代 Linux 通常两套都有——很多程序还在写传统日志,systemd 服务用 journal。
/var/log 重要文件
sudo ls /var/log/
| 文件 | 内容 |
|---|---|
syslog(Debian/Ubuntu)/ messages(RHEL) |
系统综合日志 |
auth.log(Deb)/ secure(RHEL) |
认证 / sudo / SSH |
kern.log |
内核 |
dpkg.log / yum.log |
包管理 |
nginx/access.log / error.log |
nginx |
mysql/error.log |
mysql |
apt/history.log |
apt 安装历史 |
看日志的几个套路
1. 实时跟踪
sudo tail -f /var/log/syslog
sudo tail -F /var/log/nginx/access.log # 大写 F:文件被轮转后也跟上
2. 过滤关键词
sudo grep -i error /var/log/syslog | tail -20
sudo grep "$(date +%b' '%e)" /var/log/auth.log # 今天的日志
3. 按时间段
# tail 最近 N 行
sudo tail -n 1000 /var/log/syslog | grep ERROR
# 按日期(syslog 行首是日期)
sudo awk '/May 9 10:/' /var/log/syslog
journalctl:systemd 日志查询
# 当前 boot 的所有日志
sudo journalctl
# 实时跟踪
sudo journalctl -f
# 某个服务
sudo journalctl -u nginx
sudo journalctl -u nginx -f
# 按时间
sudo journalctl --since "10 minutes ago"
sudo journalctl --since "2026-05-09 10:00"
sudo journalctl --since today
sudo journalctl --since yesterday --until "1 hour ago"
# 按优先级
sudo journalctl -p err # 仅 error 及以上
sudo journalctl -p warning -p err
# 按 PID / UID
sudo journalctl _PID=1234
sudo journalctl _UID=1000
# 内核日志
sudo journalctl -k
# 反向(最新在上)
sudo journalctl -r
# 摘要:最近一次启动各服务日志计数
sudo journalctl --list-boots
sudo journalctl -b 0 # 当前 boot
sudo journalctl -b -1 # 上次 boot
优先级
0 emerg 紧急
1 alert 警报
2 crit 严重
3 err 错误
4 warning 警告
5 notice 提示
6 info 信息(默认)
7 debug 调试
dmesg:内核环形缓冲
硬件 / 内核相关消息。
sudo dmesg # 全部
sudo dmesg -T # 带可读时间戳
sudo dmesg --level=err # 仅错误
sudo dmesg | tail -50 # 最近的
sudo dmesg -w # 实时跟踪
典型用途:
- 插 U 盘看识别成什么设备名
- 硬盘报错 / 内存错误
- OOM killer 杀进程的记录
sudo dmesg | grep -i "out of memory"
sudo dmesg | grep -i "killed process"
日志轮转:logrotate
日志会无限增长 → logrotate 自动按天 / 大小切分 + 压缩 + 删旧。
配置在 /etc/logrotate.d/:
ls /etc/logrotate.d/
# apache2 apt dpkg mysql-server nginx rsyslog ...
例 /etc/logrotate.d/myapp:
/var/log/myapp/*.log {
daily # 每天切
rotate 14 # 保留 14 份
compress # 旧的 gzip
delaycompress # 上一份不压缩(应用还在写)
missingok # 文件不存在不报错
notifempty # 空文件跳过
create 0640 myapp myapp # 切完后新文件的权限
sharedscripts
postrotate
systemctl reload myapp
endscript
}
测试:
sudo logrotate -d /etc/logrotate.d/myapp # 演练
sudo logrotate -f /etc/logrotate.d/myapp # 立即跑
看日志的实战
1. 排查 SSH 暴破
sudo grep "Failed password" /var/log/auth.log | tail -50
sudo grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head
2. 排查服务挂了
sudo journalctl -u myapp --since "10 minutes ago" -p err
3. 看是不是内存爆了
sudo dmesg -T | grep -i "killed process"
下一篇起进入模块五:网络基础。