首页/系统/Linux 运维命令速查/journalctl -u 按服务查看日志

journalctl -u 按服务查看日志

以服务为单位过滤是最高频的排障姿势:-u 服务名 + -n/-f/--since 组合,直达应用与 systemd 的启动错误。

Linux 运维命令速查系统更新于 2026-10-13

按单元过滤日志

journalctl -u 单元名 是最常用的排障姿势:它把与某个服务相关的日志全部筛出来,包括 systemd 记录的启动、停止、失败原因,以及服务自己写到标准输出与标准错误的内容。相比在 /var/log 下翻文件,它天然带时间窗过滤与启动轮次,并且能按优先级收敛结果,所以在「服务为什么起不来」这类问题上通常第一屏就能看到关键线索。

基本信息

适用平台Linux(systemd 发行版)
命令语法journalctl -u 单元名 [选项]
常用组合-n 行数、-f 跟随、--since/--until 时间窗、-p 优先级、-b 启动轮次、-r 倒序、-o 输出格式、--no-pager 不分页
单元名写法可省略 .service 后缀;模板单元必须带实例(如 myapp@8001.service)
用户单元用 --user-unit 查询 systemd --user 管理的单元,不需要 root

典型使用场景

  • 服务启动失败:直奔该单元的日志,先看 systemd 报的失败原因再看应用堆栈
  • 修改配置后验证:reload 或 restart 后立刻看最近几十行确认无异常
  • 按时间窗定位:用 --since 与 --until 圈定故障时段,忽略无关历史
  • 多单元联查:同时跟多个相关服务的日志,判断请求在哪一层断掉
  • 实时观察:-f 跟随输出,配合一次业务操作观察对应日志
  • 定时器排查:查看由 timer 触发的单元日志,确认任务是否真的执行

常用示例

常用示例
journalctl -u sshd -n 50 --no-pager
journalctl -u myapp --since '20 min ago'
journalctl -u myapp -u nginx -f          # 多单元合并查看
journalctl -u myapp -p err -b            # 本次启动中的错误及以上
journalctl -u myapp --since '2026-10-12 09:00' --until '2026-10-12 10:00'
journalctl -u myapp -o cat -n 100        # 只要消息正文
journalctl --user-unit myapp -n 50       # 用户级单元
journalctl -u myapp -r | head            # 倒序,先看最近的
systemctl status myapp --no-pager -l     # 与 status 配合看退出码

常用组合对照

组合用途注意
-u 单元 -n N看该服务最近 N 条配合 --no-pager 便于复制
-u 单元 -f实时跟随运维现场复现问题时最常用
-u 单元 -p err只看错误及以上级别会漏掉 warning 级的线索,必要时放宽到 warning
-u 单元 -b -1看上一次性启动的日志需 journald 已持久化才查得到
-u A -u B多个单元合并输出是或关系,可与其他条件叠加
-o cat只输出消息正文便于粘贴到工单或做二次处理
多个 -u 之间是或关系,而 -u 与 -p、--since 之间是与关系,可以按「单元 + 级别 + 时间窗」三层叠加收敛结果。排查时建议先放宽条件看清全貌,再逐项加过滤,避免因为条件太窄而误判「没有日志」。
日志归属由进程决定:以 Type=simple 运行的主进程及其子进程的输出归入本单位。老式 fork 型程序与某些守护进程的日志可能落到别的单元甚至 syslog 文件里,此时用 -u 找不到内容,需要改用 _COMM 字段或直接查应用自己的日志目录。反过来,如果一个单元包含多个进程,用 -u 会看到它们的日志混在一起,可再叠加 _PID 或 _COMM 收窄。
单元名拼错不会报错,只会返回空输出,容易被解读成「服务没有日志」。查不到内容时先用 systemctl list-units --type=service | grep 关键字 确认真实的单元名,并检查 journald 是否持久化(存在 /var/log/journal 目录)。
与 status 的分工:status 给出退出码、重启次数与最近几行摘要,journalctl -u 给出完整时间线。定位启动失败时两者配合效率最高——先用 status 拿到退出码与 Result,再用 journalctl -u 单元名 -b 看本次启动的完整日志,最后用 systemctl show -p ExecMainStatus 取精确值写入工单。
要同时看几个单元的日志就重复写单元参数,多个单元之间是并列关系;排除某个单元没有取反写法,通常改用过滤输出来实现。跟随模式可以与单元参数组合,服务重启前后的日志会连在一起出现,比先停服务再翻历史记录更接近真实时序。

易错点

  • 单元名写错或别名不匹配会得到空输出,误以为服务没有日志;模板单元还要带实例名(如 myapp@8001),先用 list-units 确认真实名称
  • 应用自建日志文件或把日志交给 syslog 时,-u 只能看到启动与退出信息,真正的错误要去应用日志目录里找
  • 只看单元日志不看内核日志:进程被 OOM 击杀的记录在 dmesg 与 journalctl -k 中,用 -u 查不到
  • 忘了 --no-pager 导致输出进入分页器,脚本或复制粘贴时行为异常
  • journald 未持久化时跨重启查询会落空,需要先确认 /var/log/journal 是否存在并调整 Storage
  • 直接按自己以为的名字查询:别名、模板实例名与真实单元名不完全一致时输出为空,先用列出单元的命令核对名称,再判断是不是真的没有日志

数据来源与参考

  • man 1 journalctl(-u 过滤)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌