如何在 Tomcat 中记录收到请求的 IP 地址?

如何在 Tomcat 中记录收到请求的 IP 地址?

背景介绍

我有一台服务器,其中有 3 个 IP 地址和 3 个<Host>元素定义在 中server.xml。我使用基于 IP 的虚拟主机。

我已经启用了访问日志阀在每个主机上,记录到 3 个不同的日志文件。

它运行正常,而且我可以看到根据我访问的 IP,请求被记录到正确的文件中。

到目前为止,一切都很好。

现在我正在尝试诊断负载均衡器问题,因此我需要查看每个传入请求所到达的 IP。

我的实际问题

根据文档如果您将其包含%A在访问日志模式中,它应该记录“本地 IP 地址”。

例如。pattern="%h %A %l %u %t &quot;%r&quot; %s %b"

但是,我看到的是,到达 3 个虚拟主机中的任何一个的请求都显示相同的本地 IP(即,所有 3 个日志文件都显示所有请求的相同本地 IP)

我希望在每个日志中看到不同的本地 IP。我确信它们到达了不同的 IP,因为这就是基于 IP 的虚拟主机的工作方式。

我想知道是否%A只是输出 Tomcat它的 IP 地址,而不是请求实际到达的 IP。

是否可以记录每个请求的实际 IP?我应该使用其他属性吗?

附加信息

服务器有 3 个 IP,hosts 文件包含:

10.10.10.10   localhost
10.10.10.1    serverA
10.10.10.2    serverB

我的server.xml包含:

<Connector port="80" protocol="HTTP/1.1"
        connectionTimeout="20000"
        redirectPort="443" server="Unknown"
        useIPVHosts="true" />
...
<engine>
    <Host name="localhost" appBase="C:\webapps" unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %A %l %u %t &quot;%r&quot; %s %b"/>
    </Host>

    <Host name="serverA" appBase="D:\webapps\app01">
        <Context path="/myapp" docBase="D:\webapps\app01" />
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="serverA_access_log." suffix=".txt" pattern="%h %A %l %u %t &quot;%r&quot; %s %b"/>
    </Host>

    <Host name="serverB" appBase="D:\webapps\app02">
        <Context path="/myapp" docBase="D:\webapps\app02" />
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="serverB_access_log." suffix=".txt" pattern="%h %A %l %u %t &quot;%r&quot; %s %b"/>
    </Host>
</engine>

相关内容