Linux journalctl 查询日志:时间范围、上下文与 grep 定位

syslog 日志格式没有年份

Nov 15 13:57:05 VM-0-8-centos spring_ruoyi_admin_jar: at org.springframework...

Nov 15 13:57:05 只有月日时分秒,没有年份。如果是当前年度的历史日志,通常是前一年或当年的同月。

查看完整时间戳:

journalctl -u spring_ruoyi_admin_jar -o short-iso

输出带完整 ISO 时间:

2025-11-15T13:57:05+08:00 VM-0-8-centos spring_ruoyi_admin_jar: ...

按时间范围查询

# 精确时间段
journalctl -u spring_ruoyi_admin_jar \
  --since "2025-11-15 13:52:00" \
  --until "2025-11-15 14:02:00"

# 最近 10 分钟
journalctl -u spring_ruoyi_admin_jar --since "10 minutes ago"

# 今天的日志
journalctl -u spring_ruoyi_admin_jar --since today

查看最近 N 条

# 最近 50 条,带完整时间
journalctl -u spring_ruoyi_admin_jar -n 50 -o short-iso

实时追踪(类似 tail -f)

journalctl -u spring_ruoyi_admin_jar -f

关键词上下文查询

查看匹配行前后各 50 行:

journalctl -u spring_ruoyi_admin_jar -n 1000 | grep -C 50 "查询简单视图数据失败"

-C 50 等价于 --context=50,显示匹配行前后各 50 行。

普通日志文件(非 systemd)

grep -nC 快速查上下文

grep -nC 50 "查询简单视图数据失败" /opt/logs/app.log

输出:

123400-2025-11-15 13:56:58 INFO  ...
...
123450:2025-11-15 13:57:05 ERROR 查询简单视图数据失败
...
123500-2025-11-15 13:57:12 INFO  ...

-n 显示行号,-C 50 前后各 50 行。

先找行号再打印范围

# 先找到行号
grep -n "查询简单视图数据失败" app.log
# 123456:2025-11-15 13:57:05 ERROR 查询简单视图数据失败

# 打印第 123400 到 123500 行
sed -n '123400,123500p' app.log

多关键词过滤

有时候真正原因在后面的 Caused by

grep -nC 20 "Caused by" app.log | grep -A 10 "13:57"

先找异常根因,再按时间过滤。

Docker 容器日志

# 按时间范围
docker logs --since "2025-11-15T13:52:00" --until "2025-11-15T14:02:00" 容器名

# 最近 100 条
docker logs --tail 100 容器名

# 实时
docker logs -f 容器名

Spring Boot 应用常见排查流程

  1. 先用 grep -n "ERROR" app.log 找所有错误行号
  2. grep -nC 30 "Caused by" app.log 找根本原因
  3. 如果有 requestId/traceId,用 grep "traceId=xxx" app.log 找完整请求链路
  4. 对照时间和堆栈确认是 DB 异常、Redis 异常还是下游服务超时