journalctl 过滤是什么
journalctl 用 -u 按单元名过滤、_PID= 按进程号过滤、-t 按 syslog 标识符过滤,三者都走 journald 的索引字段,而不是把日志全文交给 grep。差别在准确性:服务改名、日志正文里恰好出现同名文本时 grep 会误命中,字段过滤不会。
基本信息
| 适用平台 | Linux + systemd(-u 需 systemd 205 及以上;无 journald 的系统没有这些字段) |
|---|---|
| 命令语法 | journalctl [选项] [字段=值 ...] |
| 常用字段 | -u 单元名 / _PID=N / _SYSTEMD_UNIT= / -t 标识符 / _COMM= 进程名 |
| 权限说明 | 普通用户默认只能看自身日志,读全量需加入 systemd-journal 组或使用 sudo |
典型使用场景
- 服务排障入口:先 journalctl -u myapp -n 100 看最近日志,再按时间窗口向前收窄
- 多实例定位:同一单元拉起多个进程时,用 _PID= 精确锁定其中一个进程的输出
- 跨单元对齐:一次业务由多个单元完成时,按 _SYSTEMD_UNIT= 分别拉取再对齐时间线
- 非 systemd 程序:cron、sudo 等经 syslog 写入,用 -t 按标识符检索
- 脚本化采集:配 -o json 输出固定结构,便于程序解析与入库
常用示例
常用示例
journalctl -u myapp --since '30 min ago' -n 100 # -u 后可用简写,.service 可省略
journalctl -u myapp -u nginx --since today # 多个 -u 取并集
journalctl _PID=$(systemctl show -p MainPID --value myapp) # 按主进程号精确过滤
journalctl -t sshd -n 20 # 按 syslog 标识符(与 -u 语义不同)
journalctl -u myapp -p err --since yesterday # 只看错误级别,先减噪音
journalctl -o json-pretty -u myapp -n 1 # 展开单条日志全部字段,确认有哪些字段可过滤常用过滤字段读法
| 字段 | 含义 | 使用提示 |
|---|---|---|
| -u 单元名 | 按 systemd 单元过滤,等价于 _SYSTEMD_UNIT= | 可用 myapp 简写,多个 -u 为并集 |
| _PID= | 内核记录的进程号 | 进程重启后变化,只适合定位单次运行 |
| _SYSTEMD_UNIT= | 产生该日志的单元 | 服务 fork 出的子进程仍归同一单元,比 _PID 稳 |
| -t 标识符 | syslog 的 SYSLOG_IDENTIFIER | cron 任务为 CROND,sudo 为 sudo |
| _COMM= | 进程名 comm,最长 15 字符 | 同名进程多时会混,需叠加 _PID |
服务 fork 出子进程后,子进程日志仍归属同一单元:journald 按 cgroup 判定归属,排查服务内部子进程问题时用 -u 比 _PID 更完整。
自定义写 journal 的应用,SYSLOG_IDENTIFIER 默认取进程名,未必等于服务名;先看 journalctl -o json-pretty -n 1 的实际字段值,再写过滤条件。
系统没有 /var/log/journal 目录时 journald 不持久化,日志只在内存中,重启即丢失;跨重启排查前先开启持久化。