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

时间:2018-01-04 21:15:10

标签: java tomcat http-headers ip load-balancing

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

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

3 个答案:

答案 0 :(得分:4)

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

  

如果您运行的是大于6.0.21或tomcat 7的tomcat版本,则可以利用新的远程IP阀。对于访问日志记录,这个阀门的好处是,如果在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>
  

如果您使用的是早于6.0.21的tomcat 6版本,而您希望存储X-Forwarded-For IP地址,则可以修改AccessLogValve的pattern属性。您需要删除&#34; common&#34;或&#34;合并&#34;模式并将其替换为以下模式之一:

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
  

RemoteIP Valve确实关注的主要问题是,您只能在日志中获取X-Forwarded-For地址。如果直接点击应用服务器,绕过在请求中插入X-Forwarded-For标头的设备,则无法记录IP地址。你仍然会记录一个请求 - 你只是不知道它来自哪里。

答案 1 :(得分:0)

<Valve className="org.apache.catalina.valves.RemoteIpValve"
       remoteIpHeader="x-forwarded-for" />

<Valve className="org.apache.catalina.valves.AccessLogValve"
    requestAttributesEnabled="true"
     pattern="Remote Ip is: %{org.apache.tomcat.remoteAddr}r" />

您可以将这两个Valve定义添加到context.xml中。所以你可以在两种情况下看到远程ip。通过负载均衡器或直接。

org.apache.catalina.valves.RemoteIpValve检测到“x-forwarded-for”标头。如果标头中有“x-forwarded-for”,则将其值放入“org.apache.tomcat.remoteAddr”请求属性中。如果标头中没有“x-forwarded-for”,则将client ip addr放入“org.apache.tomcat.remoteAddr”请求属性中。

AccessLogValve config只记录“org.apache.tomcat.remoteAddr”请求属性,该属性包含正确的远程ip。

答案 2 :(得分:0)

在Tomcat / 9.0.12上运行的Java应用程序的前面使用Apache反向代理时遇到了这个问题

我通过将其添加到Tomcat conf / server.xml中进行了修复,阀门的放置位置取决于您希望根据每个Engine / Host / Context应用此阀门的天气,我已经添加了这2个阀门

<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="x-forwarded-for" protocolHeader="x-forwarded-proto" />

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="tomcat_access_log" suffix=".log" pattern="%t %{X-AUSERNAME}o %{User-Agent}i %a %m %r %b %s %D %I %{x-forwarded-for}i" />

您无需定义所有remoteIpHeader和protocolHeader,因为它们是默认值,但出于清楚原因https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html

,我添加了它们

%a将显示代理ip(或负载均衡器),%{x-forwarded-for} i将显示用户ip