tomcat默认access log日志格式为 pattern="%h %l %u %t "%r" %s %b"
%h 远程的主机名或IP
%l 远程的逻辑用户名
%u 通过身份验证的远程用户
%t 通用日志格式的日期和时间
%r 请求
%s 返回的HTTP状态码
%b 响应中发送的字节,不包括HTTP头
我定制的格式为
pattern="%h %l %u %t "%r" %s %b %D "%{User-Agent}i""
增加了请求处理时间,以及user agent
按时间段过滤日志
awk '($4>="[21/Feb/2020:22:00:00]" && $4<="[21/Feb/2020:22:00:10]"){print $0}' localhost_access_log.2020-02-21.txt
awk '($4>="[02/Mar/2020:08:00:00]" && $4<="[02/Mar/2020:08:30:00]"){print $0}' localhost_access_log.2020-03-02.txt
按照访问url进行统计,并列出前20条
awk -F\" '{print $2}' localhost_access_log.2020-02-20.txt | sort | uniq -c | sort -nr | head -20
上面这样统计,会把同一个url,?后面参数不同视为2个不同的访问而分开统计访问次数。如果要忽略url ?之后的参数差异,可以修改为
awk -F\" '{print $2}' localhost_access_log.2020-02-20.txt | awk -F\? '{printf $1 "\n"}' | sort | uniq -c | sort -nr | head -20
这样写法,仍然可能有bug,例如
GET /login.do HTTP/1.1
与
GET /login.do?a=a HTTP/1.1
被看成2条不同记录了,因为没有?的url没法切割。改进的写法为
awk -F\" '{print $2}' localhost_access_log.2020-02-20.txt | awk -F "[? ]" '{printf $2 "\n"}' | sort | uniq -c | sort -nr | head -20
找出非200的请求
awk '($9!=200 && $9!=302){print $0}' localhost_access_log.2020-02-21.txt
统计访问ip数
awk '{print $1}' localhost_access_log.2020-02-21.txt | sort | uniq | wc -l
一个稍微复杂一点的统计,统计某品牌用户数量
cat localhost_access_log.2020-03-02.txt | grep HUAWEI | awk '{print $1}' | sort | uniq | wc -l
统计某接口访问次数最多的ip
awk '($4>="[05/Mar/2020:15:40:00]" && $4<="[05/Mar/2020:15:50:00]"){print $0}' localhost_access_log.2020-03-05.txt | grep listCourse.do | awk '{print $1}' | sort | uniq -c | sort -nr | head -20
参考
https://blog.csdn.net/c1052981766/article/details/79423429
网友评论