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