Apache日志需配置%D字段记录耗时,结合Filebeat或脚本实时解析慢请求并触发Java端采样,Java端通过JFR/Async-Profiler按traceId精准采集,结果上传至S3/ES实现闭环分析。

Java应用中,Apache(通常指Apache HTTP Server或Tomcat前置的Apache)本身不直接执行Java代码,但作为反向代理或Web服务器时,其访问日志(access log)可记录请求耗时(如%D或%T字段),成为识别慢请求的第一手依据。真正实现“监控→识别→自动触发采样”,需结合日志解析、阈值判断与Java端联动(如JFR、Async-Profiler或自定义采样钩子)。以下是可行路径:
一、确保Apache日志包含准确响应时间
Apache默认access log不含耗时字段,需显式启用:
- 在
httpd.conf或虚拟主机配置中,使用LogFormat添加%D(微秒)或%T(秒,精度低):
再通过CustomLog将慢请求单独写入日志文件(可配合SetEnvIf按耗时条件分流):
SetEnvIf req_time "^[1-9][0-9]{5,}$" slow_request
CustomLog /var/log/httpd/slow.log slowlog env=slow_request
(示例:记录耗时 ≥ 100,000 微秒 ≈ 100ms 的请求)
二、用轻量工具实时解析并告警慢请求
避免轮询大日志文件,推荐使用:
-
Filebeat + Logstash:Filebeat tail 日志,Logstash 用grok提取
%D字段,当duration_us > 100000时,发HTTP请求到Java应用的采样控制端点(如/api/trigger-sampling?traceId=xxx&duration=124500) -
自研脚本(Python/bash):用
tail -f+ 正则匹配,检测到慢请求后调用Java应用提供的REST接口,触发采样逻辑
三、Java端接收指令并启动针对性采样
在Spring Boot等应用中暴露一个受控端点,例如:
- 收到请求后,校验来源IP、Token防误触
- 解析参数中的
traceId(若集成SkyWalking/Pinpoint,可关联链路)和duration - 调用采样工具API:
– 启动JFR事件录制(jdk.JavaMonitorEnter,jdk.CPULoad,jdk.GCPhasePause等)
– 或调用Async-Profiler的start命令(需提前挂载so库并开放JMX/HTTP接口)
– 或激活自定义的堆栈采样器(如基于Thread.getAllStackTraces()高频快照,仅对目标请求线程生效)
关键点:采样应绑定具体请求上下文(如Servlet线程名、MDC traceId),避免全局干扰。
四、采样结果归集与分析闭环
采样数据不能只存本地:
- JFR录制文件可自动上传至S3/MinIO,文件名含
traceId-timestamp.jfr - Async-Profiler生成的
flamegraph.svg推送到内部看板(如Grafana + Prometheus Pushgateway) - 将采样元数据(traceId、耗时、堆栈摘要、GC状态)写入Elasticsearch,供Kibana关联原始Apache日志分析根因
这样,一次慢请求从Apache日志出现,到Java端火焰图生成,全程可追溯、可复现、可自动化。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










