如何在tomcat访问日志中记录客户端IP和X-Forwarded-For IP

Kis*_*ire 3 java ip tomcat load-balancing http-headers

如何在tomcat访问日志中记录客户端IP和X-Forwarded-For IP。

我正在使用%{X-Forwarded-For} i,并且如果我通过负载均衡器进行访问,它将记录实际的客户端地址。但是,如果我直接访问tomcat实例,则不会记录实际的客户端地址。在这两种情况下,是否都可以显示实际的客户端IP地址?

mik*_*kep 5

http://www.techstacks.com/howto/configure-access-logging-in-tomcat.html中

如果您运行的tomcat版本高于6.0.21或tomcat 7,则可以利用新的远程IP Valve。对于访问日志记录,此阀门的好处是,如果在X-Forwarded-For标头中传递了IP地址,它将自动将客户端IP与通过X-Forwarded-For标头传递的IP地址交换。加载非常简单。只需在AccessLogValve声明之前将org.apache.catalina.valves.RemoteIpValve添加到server.xml中即可。例如:

 <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

  <!-- Remote IP Valve -->
    <Valve className="org.apache.catalina.valves.RemoteIpValve" />

  <!-- Access log processes all example.
    Documentation at: /docs/config/valve.html -->

  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
    prefix="localhost_access_log." suffix=".txt"
    pattern="combined" resolveHosts="false"/>
  -->
</Host>
Run Code Online (Sandbox Code Playgroud)

如果您使用的tomcat 6版本低于6.0.21,而您想存储X-Forwarded-For IP地址,则可以修改AccessLogValve的pattern属性。您需要删除“ common”或“ combined”模式并将其替换为以下模式之一:

Common Log Format: %{X-Forwarded-For}i %l %u %t "%r" %s %b
Combined Log Format: %{X-Forwarded-For}i %l %u %t %r %s %b %{User-Agent}i %{Referer}i
Run Code Online (Sandbox Code Playgroud)

RemoteIP Valve确实处理的主要问题是,您只会在日志中获得X-Forwarded-For地址。如果您直接访问应用服务器,而绕过在请求中插入X-Forwarded-For标头的设备,则不会记录IP地址。您仍然会记录一个请求,只是不知道它来自何处。

  • 您还需要在 AccessLogValue 中将“requestAttributesEnabled”属性设置为“true”。 (3认同)