journalctl -u 命令通过服务名、时间范围和日志级别组合查询指定服务日志,支持自然语言和ISO格式时间,可配合grep、-p、--no-pager等筛选输出,并需注意服务名准确性及日志保留周期限制。

用 journalctl -u 查指定服务在某段时间内的日志,本质是组合服务名 + 时间范围 + 日志级别筛选,不是“快照”但能还原关键运行状态。
按服务名和时间范围查日志
最常用写法:
-
journalctl -u nginx --since "2024-05-20 14:00:00" --until "2024-05-20 14:05:00"—— 查 nginx 在 5 分钟内的全部日志 -
journalctl -u sshd --since "2 hours ago"—— 查 sshd 近两小时日志 -
journalctl -u mysql --since today—— 查 mysql 今天从 00:00 开始的日志
注意:--since 和 --until 支持自然语言(如 yesterday、10 minutes ago),也支持 ISO 格式(2024-05-20T14:00:00),推荐用带时区的完整格式避免歧义。
聚焦业务状态:加日志级别或关键词过滤
原始日志可能冗长,可进一步缩小范围:
-
journalctl -u app.service --since "2024-05-20 10:00" --until "2024-05-20 10:10" -p info | grep -E "(started|stopped|ready|failed)"—— 只看关键状态词 -
journalctl -u app.service --since "10 minutes ago" -p err—— 仅错误级别(-p err等价于--priority=err) -
journalctl -u app.service --since "5 minutes ago" --no-pager | tail -20—— 配合--no-pager直接输出最后 20 行,适合快速检查
导出为文本便于分析或归档
把结果保存下来再处理更稳妥:
journalctl -u app.service --since "2024-05-20 09:00" --until "2024-05-20 09:15" --output=short-iso > app-status-0900-0915.log-
--output=verbose可显示更多元数据(如进程 ID、UID、消息 ID),适合深度排查 - 加
--all可显示被截断的长行(默认 journalctl 会折行)
确认服务名是否正确
别输错单位名:
- 运行
systemctl list-units --type=service | grep app查实际服务名(注意后缀,如app.service而非app) - 若服务由 systemd socket 激活,可能需同时查
journalctl -u app.socket - 用
systemctl status app.service可看到最近几条日志摘要,快速验证服务是否活跃
不复杂但容易忽略:时间范围必须落在 journal 的保留周期内。默认多数系统只存最近 1~2 周日志,如需长期留存,要配置 /etc/systemd/journald.conf 中的 MaxRetentionSec 或启用持久化存储(Storage=persistent)。


















