核心 · Key Idea
一句话:现代 Linux 服务日志默认走 systemd-journal(结构化、可索引),传统 /var/log/*.log 仍存在。journalctl -u service -f 实时跟踪,logrotate 防止日志撑爆磁盘。
是什么#
/var/log/syslog # 传统系统日志(Debian / Ubuntu)
/var/log/messages # 同上 RHEL 系
/var/log/auth.log # 登录 / sudo
/var/log/nginx/ # 应用自管的目录
journalctl -u nginx # systemd 收集的同一份服务日志
systemd-journal 把日志结构化存储(带 unit / pid / boot id),但有些发行版同时还转给 syslog,双份留底。
打个比方#
打个比方 · Analogy
旧日志 = 一沓手写日记本,按月份归档。
journal = 一台带索引的电子档案柜 —— 可以按服务、按时间、按优先级、按字段查。
关键概念#
Unit服务单元
systemd 视角下的一个服务,对应 journal 里的一段日志流。
Priority优先级
0 emerg → 7 debug。`-p err` 只看错误及以上。
Boot ID本次启动 ID
`-b` 看当次启动;`-b -1` 看上一次(适合查为啥重启)。
logrotate日志轮转
按大小 / 时间切割旧日志、压缩、删除超期。/etc/logrotate.d/*。
结构化字段Structured Fields
`journalctl -o json` 看;可以 `_PID=` `_HOSTNAME=` 字段过滤。
常用命令#
# journalctl
journalctl -u nginx -f # 实时跟随
journalctl -u nginx --since "10 min ago"
journalctl -u nginx --since today
journalctl -u nginx -p err # 只看 error 以上
journalctl -k # 内核日志
journalctl --disk-usage # journal 占用
journalctl --vacuum-time=7d # 只保留 7 天
journalctl --vacuum-size=500M
# 老派 / 应用自己写的
tail -f /var/log/nginx/error.log
zcat /var/log/nginx/access.log.2.gz | grep '500 '
less /var/log/auth.log
# logrotate
logrotate -d /etc/logrotate.conf # 调试看会做什么
logrotate -f /etc/logrotate.d/nginx # 强制立即轮转怎么工作#
journal 自己有空间限制(SystemMaxUse / 默认 10% 磁盘),不需要 logrotate。
实操要点#
-
服务日志走 stdout/stderr:systemd 自动收集 → journal。不要再自己写 /var/log 文件(容器化也是这条原则)。
-
journal 太占盘:
journalctl --vacuum-size=500M立即收,或改/etc/systemd/journald.conf的SystemMaxUse=。 -
logrotate 配置示例:
/var/log/nginx/*.log { daily rotate 14 compress missingok notifempty sharedscripts postrotate nginx -s reopen endscript } -
生产建议:app → stdout → journal → 转发到中央 ELK / Loki,本地不保留太久。
-
grep之外:rg速度更快,lnav可视化看多日志。
易混点#
journal
结构化、按 unit / 优先级查。
重启自动旋转、有空间上限。
重启自动旋转、有空间上限。
syslog / 文件日志
纯文本,依赖 logrotate。
传统工具栈友好。
传统工具栈友好。