Apache access_log是排查Java异常请求的关键入口,需结合状态码、响应时间、字节数识别真实异常,并通过awk/grep快速定位高频路径、可疑UA及非200接口,再关联Java日志(推荐用X-Request-ID)定位根因,辅以监控阈值实现自动预警。

Apache的access_log是排查Java应用异常请求的重要入口,关键不在于日志本身,而是如何快速定位模式——比如高频4xx/5xx、特定URL路径突增、异常User-Agent、重复IP短时密集访问等。
聚焦状态码与响应时间组合分析
单看200或404意义有限,需结合响应时间(%D)和字节数(%B)判断真实异常。例如:
- 400 + 极小响应时间(:大概率是恶意扫描或畸形请求(如超长URL、非法编码)
- 500 + 较长响应时间(>3s)+ 小字节数:Java后端处理中抛出未捕获异常,可能触发Tomcat默认错误页
- 200 + 响应时间波动极大(同一接口从10ms跳到2s):需关联JVM线程堆栈或GC日志,可能是锁竞争或慢SQL拖慢整个请求链路
用awk/grep快速识别高频异常路径
避免人工翻查,用命令直击问题源头:
-
统计最近1小时404最多的前5个路径:
awk '$9==404 {print $7}' access_log | sort | uniq -c | sort -nr | head -5 -
抓取含“/api/v1/order”且状态码非200的请求(含时间戳):
awk '$7 ~ /\/api\/v1\/order/ && $9!=200 {print $4,$7,$9,$10}' access_log -
筛选User-Agent含“sqlmap”或“nikto”的请求(常见扫描器):
awk -F\" '$6 ~ /(sqlmap|nikto)/ {print $4,$6,$9}' access_log
关联Java应用日志定位根因
Apache日志只反映“表象”,必须与Java侧日志对齐时间点:
立即学习“Java免费学习笔记(深入)”;
- 确保Apache与Java应用服务器时区、时间精度一致(建议统一NTP校时)
- 利用Apache的%{X-Request-ID}i或%{X-Correlation-ID}o头(需Java应用透传),在access_log和应用log中双向追踪同一次请求
- 若无唯一ID,可用“时间戳+客户端IP+请求路径+HTTP方法”四元组粗略匹配,例如:
grep "192.168.1.100.*POST.*\/login" access_log | head -1找到时间,再查对应秒级范围的应用日志
建立基础监控阈值防漏判
人工分析适合应急,长期需设简单规则自动预警:
- 每分钟4xx/5xx占比 > 5% —— 触发告警(排除爬虫白名单IP)
- 同一IP 5分钟内请求次数 > 200次且含3个以上不同404路径 —— 可能为目录爆破
- /actuator/health 或 /favicon.ico 等静态资源返回500 —— 往往说明应用已假死或类加载失败

















