从Tomcat的日志中排除某些请求

时间:2018-12-12 09:55:39

标签: tomcat logging

我的Tomcat访问日志当前负载均衡器中的运行状况检查请求混乱,因此要真正了解正在发生的事情相当困难。例如,使用GoAccess,我可以看到一些令人误解的统计信息:

Hits      h% Vis.    v%   Bandwidth Mtd Proto    Data
 ----- ------ ---- ----- ----------- --- -------- ----
 46221 81.20%    2 0.02%   30.72 MiB GET HTTP/1.1 /geoserver/index.html
 16     0.03%    1 0.01%   50.23 KiB GET HTTP/1.1 /geoserver/wms?SERVICE=WMS&VERSION=1.1.0&REQUEST=GetMap&FORMAT=image/jpeg.
 16     0.03%    1 0.01%  338.80 KiB GET HTTP/1.1 /geoserver/wms?SERVICE=WMS&VERSION=1.1.0&REQUEST=GetMap&FORMAT=image/png.

该日志是使用Tomcat的标准Access Log Valve创建的。该阀门应该具有一个参数conditionUnless,我尝试使用该参数来消除对index.html发出的所有请求(在那里进行健康检查,因此我可以安全地过滤掉他们全部)。

根据文档conditionUnless

  

打开条件日志记录。如果设置,则仅在以下情况下记录请求   ServletRequest.getAttribute()null。例如,如果此值为   设为垃圾邮件,则只有在以下情况下才会记录特定请求:   ServletRequest.getAttribute("junk") == null。使用过滤器是一种   在许多情况下设置/取消ServletRequest中的属性的简便方法   不同的请求。

但是我不知道如何使用过滤器过滤出所有对index.html的请求,并在其中标出它们。显然,server.xml中的以下内容是不够的:

<Valve  className="org.apache.catalina.valves.AccessLogValve" 
        directory="/var/log/tomcat8/accesslogs"
        prefix="node1" suffix=".log"
        pattern="combined"
        renameOnRotate="true"
        conditionUnless="index.html" />

如何排除对index.html的所有请求?

1 个答案:

答案 0 :(得分:5)

您需要创建一个将属性添加为 doLog

filter as suggested in tomcat group
public final class LoggingFilter implements Filter { 

  private FilterConfig filterConfig = null; 

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
    throws IOException, ServletException { 

    request.setAttribute(filterConfig.getInitParameter("doLog"), "true");         
    chain.doFilter(request, response); 
  } 
  public void destroy() { 
    this.filterConfig = null; 
  } 
  public void init(FilterConfig filterConfig) { 
    this.filterConfig = filterConfig;   
  } 
}

,然后使用conditionIf

检查属性名称
conditionIf="doLog"
  

条件如果
  打开条件日志记录。如果设置,则仅当ServletRequest.getAttribute()不为null时,才记录请求。例如,如果此值设置为重要,则仅当ServletRequest.getAttribute(“ important”)!= null时才记录特定请求。使用过滤器是在许多不同请求上设置/取消ServletRequest中的属性的简便方法。

并将过滤器添加到web.xml:

<filter>  
    <filter-name>LoggingFilter</filter-name>  
    <filter-class>com.yourpackage.LoggingFilter</filter-class>  
    <init-param>  
        <param-name>logParam</param-name>  
        <param-value>doLog</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>LoggingFilter</filter-name>  
    <url-pattern>/geoserver/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
<filter-mapping>