1

我尝试让 Tomcat 有条件地跳过日志记录,因此访问日志中不会充满大量本地应用程序到应用程序的通信条目。

目前我在 server.xml 中有以下内容:

<Valve className="org.apache.catalina.valves.RemoteIpValve" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/log/alfresco"
prefix="tomcat.access." suffix=".log" conditionUnless="???" pattern="combined" />

如您所见,我使用 RemoteIpValve 向我显示 X-Forwarded-For 值,而不是本地 IP。但是为了过滤实际的日志记录,我可以看到我可以在 Tomcat >7.0.30(我使用的)中使用“conditionUnless”。但是经过大量搜索后,我找不到任何工作示例和/或更详细的说明,而不是有关此 Valve 的 Tomcat 文档(https://tomcat.apache.org/tomcat-7.0-doc/config/valve. html#Access_Log_Valve)。

有人可以通过示例和/或有关如何排除以下内容的指示来帮助我:

  1. 一切都来自 IP "127.0.0.1" 和/或
  2. 到应用程序/相对 URL 的所有流量:“/abc/.*”

不幸的是,我已经填写了“/abc/.*”作为 conditionUnless 的值(代替问号),但这并没有做任何事情。

4

1 回答 1

0

这很简单!

只需编辑 server.xml,这是我的:

    <Valve className="org.apache.catalina.valves.RemoteIpValve" />
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt" conditionUnless="junk"
           pattern="%{x-forwarded-for}i %l %u %t &quot;%r&quot; %s %b %Ts %{uid}r &quot;%{User-Agent}i&quot;" />

我使用 apache mod 代理,所以我想用用户的实际 IP 地址替换所有 127.0.0.1 调用。我还想将用户 ID 和用户代理添加到日志中。随心所欲地自定义它,并随心所欲地显示它。所有 % 东西的文档都在这里:

https://tomcat.apache.org/tomcat-8.5-doc/api/org/apache/catalina/valves/AbstractAccessLogValve.html

您的问题的关键就在这里:conditionUnless="junk"这就是您需要添加到AccessLogValveValve 配置中server.xml以使其正常工作的全部内容。

然后您所做的就是创建一个过滤器,或者在您想要过滤掉的 servlet、jsp 页面等中,您只需添加以下代码:

    request.setAttribute("junk", true);

例如:

class JunkFilter extends OncePerRequestFilter {

    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        String originalUri = request.getRequestURI()
        if (originalUri.indexOf("/abc/") != -1) {
            request.setAttribute("junk", true);
        }
        if (request.getHeader('x-forwarded-host').indexOf("127.0.0.1") != -1) {
            request.setAttribute("junk", true);
        }
    }
}

注册过滤器,一切就绪!

如果您想要奖励积分,请将用户 ID 添加到日志记录中:

    request.setAttribute("uid", user == null? "anon" : user.id)
于 2019-11-08T04:54:34.937 回答