【发布时间】:2026-02-06 09:55:02
【问题描述】:
环境:Tomcat 7。
想要记录 http 请求及其标头。实际上,只要我可以记录调用者的 IP 地址、他请求的资源(URL)和请求的类型(GET、POST 等),我就可以不使用标头
这似乎是一个微不足道的问题,但实际上并非如此。
标准方法是使用AccessLogValve,但据我了解,实际上不是请求日志记录,而是请求/响应日志记录,这意味着它不会在响应结束之前记录任何内容循环。它只会记录那些响应已成功发送到 http 客户端的请求。如果在此之前出现问题,AccessLogValve 将不会记录请求。
问题1:这理解正确吗?
问题 2:还有其他选择吗?
更新 1:
我已经使用 Tomcat7 进行了测试,使用了一个基于 URL 参数阻塞 x 秒的虚拟 servlet。我的发现是,该请求确实被 AccessLogValve 记录了......尽管正如预期的那样,这直到响应结束时才会发生,即在 x 秒之后。无论客户端是否在请求完成之前中止,也无论 servlet 在处理过程中是否抛出异常,都会有一个日志条目。
因此,问题 1 的答案是:“否”。
结论
AcccesLogValve 将最终产生一个日志条目。至少我还没有能够产生一个场景不是这种情况。
【问题讨论】:
-
可以从
HttpServletRequest获取源IP、URL、方法。只需创建一个记录它们的Filter。记录请求正文的内容有点困难。您必须将HttpServletRequest包装起来。 -
@SotiriosDelimanolis。谢谢,但我无法控制应用程序,只能控制容器。
-
啊,那么我认为阀门是您唯一的选择。你不能把它配置成只抓取请求吗?
-
您是否考虑过查看
AccessValve,看看是否可以轻松适应在收到请求后立即仅记录请求? -
请求日志记录应该在tomcat之上,希望你不要把可怜的tomcat放到生产环境中没有一些httpd like层?