tomcat访问(access)日志配置和记录Post请求参数

一、配置与说明

tomcat访问日志格式配置,在config/server.xml里Host标签下加上

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
        prefix="localhost_access_log." suffix=".txt"
        pattern="%h %l %u %t "%r" [%{postdata}r] %s %{Referer}i %{User-Agent}i %T %b" />

我们在日志文件中将看到如下文本:

10.217.14.16 - - [21/Oct/2016:15:48:54 +0800] "POST /updates/related_notice_num.json HTTP/1.0" [channel=App Store&gid=92391918-2173-4A66-8B31-B2FB3F8FB3DF&os=2&plat=2&sver=10.000000&token=MzM1OTc0MjQ1MkB3ZWliby55bXguY29tfHdlaWJvfDQ5ZGFmMjk0YjQ5YWQxMTZiZjBmYWM4ZDdhYzg3ZWQ0&ua=&ver=4.2.1] 200 - AllApp/4.2.1 (iPhone; iOS 10.0.2; Scale/3.00) 0.004 91

参数说明:

className        官方文档上说了:This MUST be set to org.apache.catalina.valves.AccessLogValve to use the default access log valve。
directory 日志文件存放的目录。通常设置为tomcat下已有的那个logs文件。
prefix 日志文件的名称前缀。
suffix 日志文件的名称后缀。
pattern 最主要的参数。下面会细讲。
resolveHosts 如果是true,tomcat会将这个服务器IP地址通过DNS转换为主机名;如果是false,就直接写服务器IP地址啦。默认false。
rotatable  默认为true,tomcat生成的文件名为prefix(前缀)+.+时间(一般是按天算)+.+suffix(后缀),如:localhost_access_log.2007-09-22.txt。设置为false的话,tomcat会忽略时间,不会生成新文件,文件名就是:localhost_access_log.txt。长此以往,这个日志文件会超级大
condition 这个参数不太实用,可设置任何值,比如设置成condition="tkq",那么只有当ServletRequest.getAttribute("tkq")为空的时候,该条日志才会被记录下来。
fileDateFormat                                                                                  顾名思义,就是时间格式嘛。但这个时间格式是针对日志文件名起作用的。咱们生成的日志文件全名:localhost_access_log.2016-09-22.txt,这里面的2016-09-22就是这么来的。如果想让tomcat每小时生成一个日志文件,也很简单,将这个值设置为:fileDateFormat="yyyy-MM-dd.HH",当然也可以按分钟生成什么的,自己改改吧^_^

下面着重讲下pattern。它的参数比较多。可以设置成common,combined两种格式。

  1. common的值:%h %l %u %t %r %s %b
  2. combined的值:%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i        (至于combined的值的最后两个为什么会这样,我也不太清楚)
%a  这是记录访问者的IP,在日志里是127.0.0.1
%A  这是记录本地服务器的IP,在日志里是192.168.254.108
%b  发送信息的字节数,不包括http头,如果字节数为0的话,显示为-
%B  发送信息的字节数,不包括http头。
%h  服务器的名称。如果resolveHosts为false的话,这里就是IP地址了,例如我的日志里是10.217.14.16
%H  访问者的协议,这里是HTTP/1.0
%l  官方解释:Remote logical username from identd (可能这样翻译:记录浏览者进行身份验证时提供的名字)(always returns '-')
%m  访问的方式,是GET还是POST
%p  本地接收访问的端口
%q  比如你访问的是aaa.jsp?bbb=ccc,那么这里就显示?bbb=ccc,就是querystring的意思
%r  First line of the request (method and request URI) 请求的方法和URL
%s  http的响应状态码
%S  用户的session ID,这个session ID大家可以另外查一下详细的解释,反正每次都会生成不同的session ID
%t  请求时间
%u  得到了验证的访问者,否则就是"-"
%U  访问的URL地址,我这里是/rightmainima/leftbott4.swf
%v  服务器名称,可能就是你url里面写的那个吧,我这里是localhost
%D  Time taken to process the request,in millis,请求消耗的时间,以毫秒记
%T  Time taken to process the request,in seconds,请求消耗的时间,以秒记 

附:参考官方文档: http://tomcat.apache.org/tomcat-5.5-doc/config/valve.html

二、配置打印POST参数

另外%r参数能打印出请求的url和get参数。如果url指定访问方式是post,post的参数是打印不出来的。当需要打印post参数,该怎么办?

大家注意到我开篇举例Valve配置里的%{postdata}r。没错,这个combined格式的patterrn可以实现。但是只在valve里配置这个东东还不够。因为postdata使我们自定义的参数名。需要在request中设置这个值。下面附上设置postdata到request中的代码。

package com.xiaoxiliu
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class PostDataDumperFilter implements Filter {
  Logger logger = LoggerFactory.getLogger(getClass());
  private FilterConfig filterConfig = null;
  public void destroy() {
    this.filterConfig = null;
  } 

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    if (filterConfig == null)
      return;
    Enumeration<String> names = request.getParameterNames();
    StringBuilder output = new StringBuilder();
    while (names.hasMoreElements()) {
      String name = (String) names.nextElement();
      output.append(name).append("=");
      String values[] = request.getParameterValues(name);
      for (int i = 0; i < values.length; i++) {
        if (i > 0) {
          output.append("' ");
        } 

        output.append(values[i]);
      }
      if (names.hasMoreElements())
        output.append("&");
    }
    request.setAttribute("postdata", output);
    logger.debug("postdata: " + output);
    chain.doFilter(request, response);
  } 

  public void init(FilterConfig filterConfig) throws ServletException {
    this.filterConfig = filterConfig;
  }
}

在web.xml中添加配置该filter:

<filter>
    <filter-name>post-data-dumper-filter</filter-name>
    <filter-class>com.xiaoxiliu.PostDataDumperFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>post-data-dumper-filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping> 

三、查询访问最耗时的接口

这就要用到万能的awk了 我们的日志倒数第二列显示的访问时间。cat logs/localhost_access_log.2016-10-25.txt | awk '{print $(NF-1)" "$0}' | sort -n -r| awk '{$1="";print $0}'  按照倒数第二列由大到小显示接口以及访问时间。这样我们就能找出那些借口耗时较大,然后对其进行优化,提高用户体验。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • tomcat在linux中修改日志路径
  • Linux下定时切割Tomcat日志并删除指定天数前的日志记录
  • Linux下把tomcat日志按日期自动分割
  • LINUX 查找tomcat日志关键词命令
  • Linux tomcat下catalina.out日志文件分割
  • Tomcat 日志切割(logrotate)详细介绍
  • Tomcat日志文件定时清理备份的脚本
  • linux下实时查看tomcat运行日志的方法
  • Shell脚本切割tomcat的日志文件
  • CentOS7按时间段截取指定的Tomcat日志到指定文件的方法
(0)

相关推荐

  • CentOS7按时间段截取指定的Tomcat日志到指定文件的方法

    CentOS7之按时间段截取指定的Tomcat日志到指定文件的方法,很多朋友对此都不是很清楚,下面由脚步之家小编给大家讲解下. 复制代码 代码如下: sed -n '/2016-11-02 15:00:/,/2016-11-02 15:05:/p' catalina.out > /tmp/123/error.txt 将 catalina.out 文件的中的日志信息,按 2016-11-02 15:00 到 2016-11-02 15:05 时间段截取,然后放到 /tmp/123/ 目录下的 er

  • Tomcat 日志切割(logrotate)详细介绍

    Tomcat 日志切割 logrotate是个强大的系统软件,它对日志文件有着一套完整的操作模式,譬如:转储.邮件和压缩等,并且默认logrotate加到cron(/etc/cron.daily/logrotate)作为每日任务执行.自动有了logrotate,我想不用再自己写日志切割脚本. 如下对Tomcat日志catalina.out日志切割 # ls -lh /usr/local/tomcat/logs/catalina.out -rw-r--r-- 1 www www 14M Aug 2

  • tomcat在linux中修改日志路径

    1.   修改catalina.sh 进入tomcat安装目录/bin,找到catalina.sh,并下载到本地,同时进行备份. 对本地的catalina.sh进行修改,将下图红框所示地方改为CATALINA_OUT=/u01/app/dt/dt_logs 这里是以将日志目录修改为/u01/app/dt/dt_logs为例,以下都以此目录为例. 修改后如下 将修改后的catalina.sh文件上传到tomcat安装目录/bin,覆盖原来的文件. 2.   修改logging.properties

  • Linux tomcat下catalina.out日志文件分割

    Linux tomcat下catalina.out日志文件分割 前言: tomcat默认使用Java.util.logging记录日志,默认只记录tomcat的日志,不记录应用的日志.tomcat支持采用log4j进行日志记录,配置方法如下: 1.更新最新的tomcat_juli.jar包到./bin/目录下: 2.拷贝log4j.jar,lo4j.properties到./lib目录下; 3.删除./conf/logging.properties 4.重启 log4j配置样本 实例代码: lo

  • LINUX 查找tomcat日志关键词命令

    #查询catalina.out日志文件中的关键词为2016-04-13 11:26:00的日志信息 grep -C 10 '2016-04-13 11:26:00' catalina.out |more 解释: grep :查询,筛选 -C : grep的-A, -B, -C选项分别可以显示匹配行的后,前,后前多少行内容: 10 :是前后多少行 '2016-04-13 11:26:00' :关键词,注意是单引号包裹 catalina.out : 检索的文件 可以是目录 ./ |more : 这个

  • linux下实时查看tomcat运行日志的方法

    1.先切换到:cd usr/local/tomcat5/logs 2.tail -f catalina.out 3.这样运行时就可以实时查看运行日志了 Ctrl+c 是退出tail命令. 顺便讲一下Linux中tail命令 tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容. 1.命令格式; tail[必要参数][选择参数][

  • Tomcat日志文件定时清理备份的脚本

    以下脚本主要备份的日志文件为tomcat的catalina.out.localhost_access_log.yyyy-mm-dd.log日志和项目的日志文件,其中项目的日志文件格式为"projectname-yyyy-mm-dd.log",以下为备份脚本,具体的操作都有相应的注释,供大家参考,具体情况请根据日志文件的格式和要求来使用本脚本. #!/bin/sh ###### # 日志定时运行时间为每天0点1分 # 删除20天之前的日志文件,压缩一周之前的日志文件 # 日志文件时间是根

  • Shell脚本切割tomcat的日志文件

    鉴于在调试logback和log4j的文件切割一直无法成功,随性用shell写个脚本用来切割tomcat下的日志文件(大家如果有在logback或log4j使用文件切割成功的话,可以留下使用方式,先谢谢了) 1:废话少说,直接贴上脚本: #!/bin/sh log_dir=/var/log/tomcat monitor_file=$1 #tomcat目录下的catalina.out文件的绝对路径 file_size=`du $monitor_file | awk '{print $1}'` if

  • Linux下定时切割Tomcat日志并删除指定天数前的日志记录

    System.out和System.err都被打印到catalina.out.catalina.out不会rotate.一般在部署Tomcat后,运行久了,catalina.out文件会越来越大,对系统的稳定造成了一定的影响. 1.可通过修改conf/logging.properties日志配置文件来屏蔽掉这部分的日志信息. [root@localhost conf]# pwd /usr/local/tomcat/conf [root@localhost conf]# cp logging.pr

  • Linux下把tomcat日志按日期自动分割

    Linux中tomcat日志分割需要用到cronolog 附上cronolog-1.6.2.tar.gz 1. 安装cronolog tar –zxvf cronolog-1.6.2.tar.gz ./configure && make && make install 解压,编译, 安装 (安装后目录一般在/usr/local/中) 2. 为了能够一次正确通过还是验证一下是在哪个目录 which cronolog 3.修改catalina.sh脚本 vim /usr/loc

随机推荐