本文整理常用日志检索命令,用于快速定位某个时间段内指定接口的 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:00 到 14: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 文件,使用 zgrep 或 zcat。
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. 常用排查顺序
- 先按时间段查接口 request / response。
- 从接口日志中拿到
trace_id。 - 用
trace_id查询完整链路。 - 如果没有业务日志,确认是否只打印了 filter 日志。
- 如果当前日志没有,继续查当天
.gz归档。 - 输出给他人排查前,脱敏
authorization、手机号、身份证、学生姓名等敏感信息。