为出海而探索,为选择多想一步。CROSSBORDER GEEK / K8N.COM
K8N跨境极客CrossBorder Geek

教程

2026 Linux 日志管理入门:journalctl 与 logrotate 实操指南

日志不会自己变小,磁盘会被它吃满

刚上手 的常见剧情:网站跑着跑着,磁盘突然满了,网站打不开,一看 /var/log 或者 journal 占了好几个 G。日志本身不产生价值,但它会一直写。这一篇把「查日志」和「管日志」两件事讲明白:前者用 journalctl,后者用 logrotate,都是 systemd 系发行版(Ubuntu、Debian、CentOS 等)自带的东西,不用装额外软件。

journalctl:把日志当数据库查

在 systemd 系系统里,服务日志默认进 journal。journalctl 不带参数会把所有日志从头打印一遍,真正干活靠过滤参数:

Linux 日志管理手绘插画 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

最近一周热门文章

按近 7 天访问热度排序,热度积累前优先展示新文章。

当前栏目最新文章

教程 · 继续阅读同栏目的新内容

一起交流

0 条留言

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

LEAVE A NOTE

你的经验,也很重要。

无需注册或登录。请勿公开邮箱密码、证件、银行卡号或其他敏感信息。

更多阅读
K8N · CrossBorder Geek

给出海玩家、独立开发者、跨境博主与外贸人的选型笔记。

关于这个博客 ↗