【问题标题】:Conditionally filter Tomcat AccessLogValve有条件地过滤 Tomcat AccessLogValve
【发布时间】:2015-06-03 13:26:44
【问题描述】:

我尝试让 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 (https://tomcat.apache.org/tomcat-7.0-doc/config/valve.html#Access_Log_Valve) 的 Tomcat 文档中的说明。

有人可以帮我举个例子和/或说明如何排除以下内容:

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

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

【问题讨论】:

  • 你弄明白了吗?你能发布你的答案吗?
  • 恐怕不行。没有回应 en 自己找不到解决方案。
  • 谢谢,在查看了不同的帖子和thread 之后,我决定在事后进行过滤。我主要以开发运维人员的身份进行操作,如果没有完全回归,我无法将 jar 文件添加到我的生产服务器。

标签: tomcat server.xml


【解决方案1】:

很简单!

只需编辑 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" 这就是您需要添加到server.xml 中的AccessLogValve Valve 配置以使其工作的全部内容。

然后你要做的就是创建一个过滤器,或者在你想要过滤掉的 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)

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2021-03-10
    • 2019-07-27
    • 2019-09-30
    • 2016-08-16
    相关资源
    最近更新 更多