journalctl 时间窗检索
journald 把内核、服务与应用的日志统一存放在二进制 journal 中,journalctl 是唯一的检索入口。它的优势是支持结构化过滤:按时间窗、按服务单元、按优先级组合检索,还能导出成便于排序或程序解析的格式。定位事件时间窗时,先固定 UTC 基准,再用相对或绝对时间限定范围,可以把几十万行日志收敛到几百行以内。
基本信息
| 时间窗 | --since 与 --until 支持绝对时间与相对写法(如 2 hours ago) |
|---|---|
| 按单元 | -u 服务单元名,与 systemctl 使用同一套名字 |
| 按优先级 | -p warning 只看告警及以上(err、crit 更严) |
| 按启动轮次 | -b 本次启动、-b -1 上一次启动、-b -2 上上次 |
| 输出格式 | -o short-iso 带完整时间戳,-o json 供程序解析 |
| 持久化 | 仅在 /var/log/journal 存在且配置持久化时保留历史,否则重启后丢失 |
典型使用场景
- 按事件时间窗提取服务日志,重建当日时间线
- 确认某个服务在告警前后的报错与重启记录
- 排查上一次重启之前的现场,确认是否是攻击者触发重启
- 导出结构化日志交给分析脚本处理
- 确认日志是否被清理或存在缺口
常见检索组合
常见检索组合
date -u # 先固定 UTC 基准
sudo journalctl --since 'today' -u sshd --no-pager | tail -n 50
sudo journalctl --since '2026-10-01 08:00' --until '2026-10-01 12:00' --no-pager | head -n 100
sudo journalctl -p warning --since '-24 hours' --no-pager | head -n 60
sudo journalctl -b -1 -u sshd --no-pager | tail -n 30 # 上一次启动的日志
sudo journalctl -o short-iso --since '-30 min' -u nginx --no-pager
sudo journalctl --disk-usage; ls -ld /var/log/journal 2>/dev/null # 确认存储与持久化输出字段读法
| 字段 | 含义 | 注意点 |
|---|---|---|
| 时间戳 | 默认为本地时区,带秒级精度 | 写时间线前必须先确认时区是否统一 |
| 主机名 | 产生日志的主机 | 集中收集时用于区分来源 |
| 单元与 PID | 服务名与进程号 | 同一 PID 连续异常说明是同一个实例在重复失败 |
| 优先级 | 日志级别数字与文字 | err 以上才是告警级别,info 噪声很大 |
| 消息 | 具体内容 | 含路径、地址与错误码,是提取 IOC 的来源 |
单元名写错不会报错,只会返回空结果:用 -u 前先用 systemctl list-units 核对准确名字,否则很容易误判为「该服务没有日志」。这是排查时最常见的假阴性来源。
journal 使用系统本地时区,而采集脚本常按 UTC 记录时间。两类时间混在同一份时间线里会造成整段顺序错误,务必在每条记录上显式标注时区,并统一换算。