Linux日志管理
约 726 字大约 2 分钟
2026-08-30
日志是排查问题、审计操作的第一手资料。Linux 的系统日志分两套体系:systemd 时代的 journal 二进制日志(用 journalctl 查看),以及继续由 rsyslog 写入 /var/log 的传统文本日志。本文介绍如何查看、轮转和清理日志,避免日志把磁盘占满。
常见日志文件
| 文件 | 内容 |
|---|---|
| /var/log/messages(RHEL/CentOS) /var/log/syslog(Debian/Ubuntu) | 系统综合日志 |
| /var/log/secure(RHEL/CentOS) /var/log/auth.log(Debian/Ubuntu) | SSH 登录、sudo 等安全认证日志 |
| /var/log/cron | 定时任务执行记录 |
| /var/log/maillog | 邮件服务日志 |
| /var/log/dmesg | 内核环形缓冲区转储,含硬件与驱动信息 |
| /var/log/btmp 与 /var/log/wtmp | 失败与成功的登录记录,分别用 lastb、last 查看 |
提示
应用自身的日志一般独立存放,如 Nginx 默认在 /var/log/nginx/,MySQL 默认在 /var/log/mysql/ 或数据目录下。
使用 journalctl 查看日志
journalctl -u nginx # 按服务查看
journalctl -b # 本次开机以来的日志
journalctl --since "2026-08-30 10:00" --until "2026-08-30 12:00"
journalctl -p err # 仅看错误及以上级别
journalctl -n 100 # 最近 100 行
journalctl -f # 实时滚动,类似 tail -f提示
部分发行版的 journald 默认只把日志存放在内存中,重启后即丢失。执行 mkdir -p /var/log/journal && systemctl restart systemd-journald 即可开启持久化。
journal 自身的磁盘占用可在 /etc/systemd/journald.conf 中设置上限,例如 SystemMaxUse=500M,修改后执行 systemctl restart systemd-journald 生效。
使用 logrotate 轮转日志
logrotate 负责日志的按期切割、压缩与删除,主配置为 /etc/logrotate.conf,各服务的规则放在 /etc/logrotate.d/ 目录下。以一份 Nginx 规则为例说明常用参数:
/var/log/nginx/*.log {
daily # 每天切割一次
rotate 14 # 保留 14 份历史
missingok # 日志不存在时不报错
notifempty # 空文件不切割
compress # 对归档做 gzip 压缩
delaycompress # 归档延迟一轮再压缩
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript # 切割后通知 Nginx 重新打开日志文件
}这些规则由系统的每日任务(/etc/cron.daily/logrotate)自动执行,通常无需干预。修改规则后,可先调试验证再强制执行一次:
logrotate -d /etc/logrotate.d/nginx # 调试模式,只打印计划不真正执行
logrotate -f /etc/logrotate.d/nginx # 强制立即轮转一次清理日志释放空间
日志占满磁盘是常见故障。先定位再清理:
du -sh /var/log/* | sort -rh | head -n 10 # 找出占用最大的日志目录
journalctl --disk-usage # 查看 journal 占用
journalctl --vacuum-size=200M # 将 journal 压缩到 200M 以内
journalctl --vacuum-time=7d # 只保留最近 7 天警告
不要直接 rm 正在写入的日志文件:进程仍持有文件句柄,磁盘空间不会释放,还可能影响服务。正确做法是清空文件内容(如 : > /var/log/xxx.log)或使用 logrotate 与上面的 vacuum 命令处理。「删除文件后空间未释放」的原理与修复方法见磁盘空间异常排查。
