如何在Tomcat访问日志中记录客户端IP和X-Forwarded-For IP。
我正在使用% {X-Forwarded-For}i,如果通过负载均衡器访问,则记录实际客户端地址。但是,如果我直接访问Tomcat实例,则不记录实际客户端地址。是否有一种方法可以在这两种情况下显示实际客户端IP地址?
如何在Tomcat访问日志中记录客户端IP和X-Forwarded-For IP。
我正在使用% {X-Forwarded-For}i,如果通过负载均衡器访问,则记录实际客户端地址。但是,如果我直接访问Tomcat实例,则不记录实际客户端地址。是否有一种方法可以在这两种情况下显示实际客户端IP地址?
来自http://www.techstacks.com/howto/configure-access-logging-in-tomcat.html:
如果你正在运行的Tomcat版本大于6.0.21或Tomcat 7,你可以利用新的Remote IP Valve。对于访问日志记录,这个valve的好处是,如果X-Forwarded-For头传递了IP地址,它将自动将客户端IP与传递的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>
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 地址。你仍然会记录请求,但不知道它来自哪里。
我曾经遇到过使用Apache反向代理在Tomcat/9.0.12上运行Java应用程序时出现的问题。
我通过将以下内容添加到Tomcat conf/server.xml中解决了这个问题。放置阀门的位置取决于您是想针对每个引擎/主机/上下文应用此设置,我已经添加了这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" />
x-forwarded-for
区分大小写吗? - Yu Jiaao<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" />
为了进一步增加已经在这里提供的答案,您还可以排除负载均衡器记录检查。
当请求通过RemoteIpValve
时,如果请求具有X-Forwarded-For
头(或您配置的任何remoteIpHeader
),则会向请求添加一个名为org.apache.catalina.AccessLog.RemoteAddr
的属性。然后,您可以在AccessLogValve
中仅在存在此属性时才记录它。
此示例适用于tomcat9。
<Valve className="org.apache.catalina.valves.RemoteIpValve" />
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="access"
suffix=".log"
pattern="combined"
renameOnRotate="true"
requestAttributesEnabled="true"
maxDays="90"
conditionIf="org.apache.catalina.AccessLog.RemoteAddr"
/>
requestAttributesEnabled
属性设置为true
。 - sandeepd