Linux 日志检索速查:按时间、接口、Trace ID 查询完整请求链路

本文整理常用日志检索命令,用于快速定位某个时间段内指定接口的 request、response 以及中间业务日志。

日志格式说明

典型日志格式:

text 复制代码
2026-05-14 14:06:20.880 [http-nio-6072-exec-5] INFO  trace_id span_id trace_flags logger - message

常用字段:

  • 第 1-2 列:日志时间
  • 第 5 列:trace_id
  • => Request:请求日志
  • <= Response:响应日志
  • cost:接口耗时
  • Params.body:请求体

1. 查询某个时间段所有日志

适合查看 14:05:0014:06:59 的全部日志,并保留异常堆栈等多行内容。

bash 复制代码
DATE="2026-05-14"

awk -v start="$DATE 14:05:00.000" -v end="$DATE 14:07:00.000" '
/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}/ {
  ts=substr($0,1,23)
  printing=(ts >= start && ts < end)
}
printing
' logs/app.log logs/error.log

2. 快速粗查某两分钟关键行

只看单行日志时可以用 grep

bash 复制代码
grep -E "2026-05-14 14:05|2026-05-14 14:06" logs/app.log logs/error.log

3. 按接口路径查询 Request / Response

示例接口:

bash 复制代码
URI="/badge-application/parent/application"
DATE="2026-05-14"

awk -v start="$DATE 14:05:00.000" -v end="$DATE 14:07:00.000" -v uri="$URI" '
/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}/ {
  ts=substr($0,1,23)
  in_range=(ts >= start && ts < end)
}
in_range && index($0, uri) > 0
' logs/app.log logs/error.log

4. 根据接口日志提取 Trace ID

请求和响应之间的业务日志通常可以用同一个 trace_id 串起来。

bash 复制代码
DATE="2026-05-14"
URI="/badge-application/parent/application"

awk -v start="$DATE 14:05:00.000" -v end="$DATE 14:07:00.000" -v uri="$URI" '
/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}/ {
  ts=substr($0,1,23)
  in_range=(ts >= start && ts < end)
}
in_range && index($0, uri) > 0 {
  print $5
}
' logs/app.log logs/error.log | sort -u

5. 根据 Trace ID 查询完整链路

bash 复制代码
TRACE_ID="1549b119274cfe3c57b4e21c54fc43d9"

grep -F "$TRACE_ID" logs/app.log logs/error.log

6. 自动查询指定接口的完整链路

一步提取接口相关 trace_id,再输出这些请求的全部日志。

bash 复制代码
DATE="2026-05-14"
URI="/badge-application/parent/application"

TRACE_IDS=$(awk -v start="$DATE 14:05:00.000" -v end="$DATE 14:07:00.000" -v uri="$URI" '
/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}/ {
  ts=substr($0,1,23)
  in_range=(ts >= start && ts < end)
}
in_range && index($0, uri) > 0 {
  print $5
}
' logs/app.log logs/error.log | sort -u)

for tid in $TRACE_IDS; do
  echo "===== TRACE_ID: $tid ====="
  grep -F "$tid" logs/app.log logs/error.log
done

7. 查询归档压缩日志

如果日志已滚动为 .gz 文件,使用 zgrepzcat

bash 复制代码
zgrep -F "$TRACE_ID" logs/app-2026-05-14-*.log.gz logs/error-2026-05-14-*.log.gz

保留多行堆栈时:

bash 复制代码
DATE="2026-05-14"

zcat logs/app-"$DATE"-*.log.gz logs/error-"$DATE"-*.log.gz 2>/dev/null | awk -v start="$DATE 14:05:00.000" -v end="$DATE 14:07:00.000" '
/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}/ {
  ts=substr($0,1,23)
  printing=(ts >= start && ts < end)
}
printing
'

8. 从请求体中提取学生学号

如果学号在图片 URL 中,例如:

text 复制代码
filePath=2009268_Test, Student13!

可以这样提取:

bash 复制代码
grep -F "/badge-application/parent/application" logs/app.log \
  | grep -oE 'filePath=[0-9]+' \
  | sed 's/filePath=//' \
  | sort -u

如果要带时间段:

bash 复制代码
DATE="2026-05-14"
URI="/badge-application/parent/application"

awk -v start="$DATE 13:00:00.000" -v end="$DATE 15:00:00.000" -v uri="$URI" '
/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}/ {
  ts=substr($0,1,23)
  in_range=(ts >= start && ts < end)
}
in_range && index($0, uri) > 0
' logs/app.log | grep -oE 'filePath=[0-9]+' | sed 's/filePath=//' | sort -u

9. 常用排查顺序

  1. 先按时间段查接口 request / response。
  2. 从接口日志中拿到 trace_id
  3. trace_id 查询完整链路。
  4. 如果没有业务日志,确认是否只打印了 filter 日志。
  5. 如果当前日志没有,继续查当天 .gz 归档。
  6. 输出给他人排查前,脱敏 authorization、手机号、身份证、学生姓名等敏感信息。
相关推荐
ch.ju1 小时前
Java程序设计(第3版)第四章——什么是对象
java·开发语言
蜀道山老天师1 小时前
Prometheus监控Hadoop集群(实操完整版,含避坑指南)
大数据·linux·运维·hadoop·云原生·prometheus
biubiubiu07061 小时前
Ubuntu命令练习
linux·运维·ubuntu
曦夜日长1 小时前
Linux系统篇,开发工具(二):vim的使用与配置
linux·服务器·vim·excel
2301_792674861 小时前
java学习(day34)
java·开发语言·学习
呉師傅1 小时前
将CD音频抓轨转换成MP3的两种方法【图文解释】
运维·服务器·网络·windows·电脑·音视频
iceman19521 小时前
ubuntu 25.10升级到26.04
linux·服务器·ubuntu
拾光Ծ1 小时前
【Linux系统】线程(上)
java·linux·运维·jvm·线程·c/c++
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第54题】【JVM篇】第14题:什么是可达性分析算法?
java·jvm·算法·面试