【问题标题】:Tomcat request logging - how to?Tomcat 请求日志记录 - 如何?
【发布时间】: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层?

标签: java tomcat tomcat7


【解决方案1】:

我看到的所有访问日志都是在处理请求/响应之后写入的,因为记录响应大小或总处理时间等信息很有用。

“如果在此之前出现问题,AccessLogValve 将不会记录请求。

问题一:这个理解正确吗?”

不,不是根据我的经验。始终记录请求/响应,即使处理它时出错。在这种情况下,HTTP 状态代码字段(日志模式中的%s)将包含错误代码,例如 500。

【讨论】: