如何从完整的日志文件中跟踪特定的用户流

时间:2014-05-28 13:48:53

标签: java log4j

生成的日志文件包含访问该应用程序的所有用户的日志行。有没有办法追溯(或拉出)特定用户从特定IP地址生成的特定日志行?

我对以下内容更感兴趣:

  • 记录数据以实现上述问题解决方案的理想方式是什么?
  • 是否有任何好的工具可以根据几个参数从完整文件中提取特定的日志行?
  • 如何将userId和IP地址记录到每个日志行? (我知道MDC有帮助但我们需要在每个日志语句之前添加所需的变量,这很乏味。)

注意:我不想使用grep命令从日志文件中提取所需的行。

仅供参考,我使用的是commons-logging和log4j框架。

1 个答案:

答案 0 :(得分:0)

以下是每个问题的解决方案:

  • 记录数据以实现上述问题的解决方案的理想方法是什么? [解决方案]将IP地址和userId添加到日志文件中以实现
  • 是否有任何好的工具可以根据几个参数从完整文件中提取特定的日志行? [解决方案]用户日志分析工具,如LogExpert,BairTail或Apache Chainsaw等。
  • 如何将userId和IP地址记录到每个日志行? (我知道MDC有帮助,但我们需要在每个日志语句之前添加所需的变量,这很乏味。) [解决方案]使用servlet过滤器使用MDC配置所需的值。如下:

Java Servlet过滤器代码(LogServletFilter.java)

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        MDC.put("userId", "XXXXX");
        MDC.put("ipAddr", "AB.CD.EF.GH");
        filterChain.doFilter(request, response);
    }

的log4j.xml

    <layout class="org.apache.log4j.PatternLayout">
     <!-- The default pattern: Date Priority [Category] Message\n -->
     <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p (%t) [%c{1}] %X{userId} %X{ipAddr} %m%n"/>
  </layout>

的web.xml

      <filter>
      <filter-name>logFilter</filter-name>
      <filter-class>com.web.filter.LogServletFilter</filter-class>
      </filter>

      <filter-mapping>
      <filter-name>logFilter</filter-name>
      <url-pattern>/*</url-pattern>
      </filter-mapping>