journalctl 是 systemd 的日志查询工具,支持按服务、时间、优先级等字段过滤;journald 自身实现配额驱动的日志轮转,无需 logrotate,并需手动启用持久化存储。

Linux系统中,journalctl 是 systemd 日志子系统的命令行接口,用于查看、过滤和管理由 journald 服务收集的结构化日志。它比传统 syslog 更灵活,支持时间戳、服务名、优先级、进程ID等元数据查询。而日志轮转(log rotation)在 journald 中并非通过 logrotate 工具实现,而是由 journald 自身的配置机制控制——这是很多用户容易混淆的关键点。
journalctl 基础用法与高效过滤技巧
journalctl 默认输出全部日志(从上次启动开始),但实际运维中需精准定位问题:
- 按服务查日志:`journalctl -u sshd.service` 查 SSH 服务;可加 `-f` 实时跟踪,`-n 50` 只看最近50行
- 按时间范围筛选:`journalctl --since "2024-05-20 14:00:00"` 或 `--since "2 hours ago"`
- 按优先级过滤:`journalctl -p err`(只看错误)、`-p warning..err`(警告到错误之间)
- 按进程或用户查:`journalctl _PID=1234` 或 `_UID=1001`(下划线开头表示匹配字段)
- 导出为 JSON 格式:`journalctl -o json -u nginx.service > nginx.log.json`,便于脚本解析
journald 的日志存储路径与持久化配置
默认情况下,journald 日志是 易失性 的,存于 /run/log/journal/(内存文件系统,重启即丢)。要永久保存,必须启用持久化:
- 创建目录:
sudo mkdir -p /var/log/journal - 触发配置重载:
sudo systemd-tmpfiles --create --prefix /var/log/journal - 确认生效:
ls /var/log/journal/*/system.journal应有文件生成 - 验证是否启用:
journalctl --disk-usage显示已用磁盘空间,非零即表示持久化开启
注意:修改 /etc/systemd/journald.conf 后需运行 sudo systemctl restart systemd-journald 才会生效。
journald 内置轮转机制:不是 logrotate,而是配额驱动
journald 不依赖外部工具做轮转,而是通过 空间配额 + 时间保留 + 文件数量限制 自动清理旧日志:
-
空间限制:设置
SystemMaxUse=1G(系统日志总上限),SystemKeepFree=500M(至少保留空闲空间) -
时间保留:
MaxRetentionSec=1month表示最多保留一个月内的日志(即使空间充足) -
单文件大小:
SystemMaxFileSize=100M控制单个 journal 文件最大体积 - 清理触发时机:每次 journalctl 查询、journald 启动、或定时器(
systemd-journald-dev-log.socket相关)都会检查并执行清理
手动清理可执行:journalctl --vacuum-size=200M(保留最新200MB)或 --vacuum-time=3d(删3天前日志)。
与传统 syslog 共存及日志归档建议
部分环境仍需将 journald 日志同步到 /var/log/messages 等传统位置,可通过以下方式桥接:
- 启用
ForwardToSyslog=yes(在/etc/systemd/journald.conf中),journald 会将日志转发给 rsyslog/syslog-ng - rsyslog 配置中加载
imjournal模块,实现双向兼容 - 长期归档建议:定期用
journalctl -o json --all --no-pager > archive_$(date +%F).json导出,并压缩存离线存储 - 敏感日志脱敏:导出前可用
jq过滤字段,如journalctl -o json | jq 'del(.MESSAGE, ._CMDLINE)'
基本上就这些。掌握 journalctl 的字段过滤和 journald 的配额式轮转逻辑,比死记命令更重要。配置不复杂,但容易忽略持久化和空间阈值设置,导致排查时“日志不见了”。










