教程
2026 Linux 日志管理入门:journalctl 与 logrotate 实操指南
日志不会自己变小,磁盘会被它吃满
刚上手 VPS 的常见剧情:网站跑着跑着,磁盘突然满了,网站打不开,一看 /var/log 或者 journal 占了好几个 G。日志本身不产生价值,但它会一直写。这一篇把「查日志」和「管日志」两件事讲明白:前者用 journalctl,后者用 logrotate,都是 systemd 系发行版(Ubuntu、Debian、CentOS 等)自带的东西,不用装额外软件。
journalctl:把日志当数据库查
在 systemd 系系统里,服务日志默认进 journal。journalctl 不带参数会把所有日志从头打印一遍,真正干活靠过滤参数:
AI 示意图·以官网实际界面为准
| 需求 | 命令 |
|---|---|
| 看某个服务的日志 | journalctl -u nginx |
| 实时跟踪某个服务 | journalctl -f -u nginx |
| 只看错误及以上级别 | journalctl -p err |
| 看内核日志 | journalctl -k |
| 看上一次启动的日志 | journalctl -b -1 |
| 按时间范围过滤 | journalctl --since "1 hour ago" |
| 输出不分页(适合脚本) | journalctl --no-pager |
| 看 journal 占用磁盘 | journalctl --disk-usage |
几个实用组合:排查服务起不来的问题,先 journalctl -u 服务名 -b 看本次启动的日志;进程在跑但行为异常,journalctl -f -u 服务名 挂着实时看;想确认是不是 OOM 杀的,journalctl -k | grep -i oom。日志默认会分页(less),脚本里记得加 --no-pager。
logrotate:日志的定时清理
journal 有 systemd-journald 自动管理配额,但传统文本日志(Nginx、PHP、应用自己写的 log)不会自动变小,靠 logrotate 轮转。它的逻辑是:按时间或大小把当前日志改名归档,压缩旧的,删掉超过保留数量的,然后让应用重新打开日志文件。

logrotate 的主配置在 /etc/logrotate.conf,include /etc/logrotate.d 会加载目录下每个应用的独立配置。一个典型的 Nginx 配置长这样:
/var/log/nginx/*.log {
weekly
rotate 4
compress
delaycompress
missingok
notifempty
copytruncate
}
weekly:每周轮转一次(也可daily、monthly)rotate 4:保留 4 份旧日志compress/delaycompress:压缩,且延迟一轮再压(给日志写入进程缓冲时间)missingok:文件不存在不报错notifempty:日志为空就不转copytruncate:先复制再清空原文件,适合那种没法通过信号重新打开日志的应用
能用信号重载日志的应用(Nginx 是 nginx -s reopen),可以用 postrotate 脚本让它在轮转后重新打开日志,这样不会丢日志。要注意手册里写明的几个坑:size 100k 这类大小条件与时间条件互斥,写了 size 就按大小转;sharedscripts 可以让一个段里多个日志只跑一次脚本;通配符要小心,/var/log/*/*.log 可能把已经轮转过的旧文件也卷进去。
日志占满磁盘时的应急顺序
发现磁盘爆满,先看占大头的是什么:journalctl --disk-usage 查 journal 占用,du -sh /var/log/* 查文本日志。应急三步:journal 可以 journalctl --vacuum-size=200M 只留最近 200M(或 --vacuum-time=7d 只留 7 天);文本日志先 logrotate -f /etc/logrotate.conf 强制转一轮;还是不够就手动删最老的归档,rm 前先 ls -lh 确认删的是哪个文件。

常见问题
1. journal 日志默认存多久?
取决于 systemd-journald 的配额设置与 Storage= 配置,默认会按磁盘配额自动清理旧日志,具体以发行版配置为准,journalctl --vacuum-size 可以手动收紧。
2. 删了日志文件服务会挂吗?
copytruncate 模式下不会,但直接 rm 一个正在被进程打开的日志,进程会继续往已删除的 inode 写,磁盘空间不释放,需要重启进程或重开文件句柄。
3. logrotate 多久跑一次? 通常由 cron 或 systemd timer 每天跑一次,手册原文是「一般作为每日 cron 任务运行」;想真正按小时转,需要改调度配置。
4. 看不懂报错怎么定位?
先 journalctl -p err -b 看本次启动的错误,再按服务名收窄范围,配合 --since 限定时间窗口,比翻整个日志高效得多。
官方资料
资料核对日期:2026-10-30
- journalctl 手册(freedesktop systemd 文档):https://www.freedesktop.org/software/systemd/man/latest/journalctl.html
- logrotate 手册(Linux man-pages):https://man7.org/linux/man-pages/man8/logrotate.8.html
最近一周热门文章
按近 7 天访问热度排序,热度积累前优先展示新文章。
当前栏目最新文章
教程 · 继续阅读同栏目的新内容
一起交流
0 条留言LEAVE A NOTE
你的经验,也很重要。
无需注册或登录。请勿公开邮箱密码、证件、银行卡号或其他敏感信息。
















还没有留言,来分享你的想法吧。