分析Apache日志文件,统计各种实用信息
FROM:http://blog.topspeedsnail.com/archives/160
Apache访问日志记录了Apache处理的所有的请求。访问日志存储目录由CustomLog指定。下面我们来分析日志并得出有用的统计。
我的Apache日志存储目录 /var/log/apache2
access.log 文件几本结构示例
1
2
3
4
|
138.128.75.90 - - [15/Nov/2015:19:05:45 -0500] "GET /index.php?qa=register&to=index.php%3Froute%3Dproduct%252Fspecial HTTP/1.1" 200 2791 "http://www.topspeedsnail.com/" "Mozilla/5.0 (Windows NT 5.1; rv:35.0) Gecko/20100101 Firefox/35.0"
138.128.75.90 - - [15/Nov/2015:19:05:47 -0500] "POST /index.php?qa=register&to=index.php%3Froute%3Dproduct%252Fspecial HTTP/1.1" 200 2848 "http://www.topspeedsnail.com/index.php?qa=register&to=index.php%3Froute%3Dproduct%252Fspecial" "Mozilla/5.0 (Windows NT 5.1; rv:35.0) Gecko/20100101 Firefox/35.0"
66.249.66.103 - - [15/Nov/2015:19:06:45 -0500] "GET /index.php?qa=5472&qa_1=what-are-the-advantages-of-cookies HTTP/1.1" 200 6069 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
180.76.15.154 - - [15/Nov/2015:19:07:05 -0500] "GET /index.php?qa=4978&qa_1=how-you-can-include-a-groovy-script-in-another-groovy HTTP/1.1" 200 6079 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
|
分析apache日志分析文件
原则上是用 awk 命令处理每一行,分离出有用的信息。因为每一行数据都是安一定标准输出,所以我们处理起来也不难。
用空白字符(空格或Tab)我们可以得到如下基本代码:
1
2
3
4
5
6
7
8
9
|
awk '{print $1}' access.log // ip地址
awk '{print $2}' access.log // RFC 1413 身份
awk '{print $3}' access.log // 用户 ID
awk '{print $4,5}' access.log // 时间
awk '{print $9}' access.log // 状态码
awk '{print $10}' access.log // 大小
awk -F" '{print $2}' access.log // 请求
awk -F" '{print $4}' access.log // 引用地址
awk -F" '{print $6}' access.log // 用户代理 (user agent)
|
如执行用户代理命令
下面是一些实用的例子:
列出所有用户代理(user agent)并按出现次数排列(从高到低)
1 |
awk -F" '{print $6}' access.log | sort | uniq -c | sort -fr
|
定位网站问题(通过状态码统计)
1 |
awk '{print $9}' access.log | sort | uniq -c | sort
|
第一列个数,第二列状态码(正常值200)
- 200 – OK
- 206 – Partial Content
- 301 – Moved Permanently
- 302 – Found
- 304 – Not Modified
- 401 – Unauthorised (password required)
- 403 – Forbidden
- 404 – Not Found
什么引起的404?
丢失文件或资源造成404错误,查看请求 URI 来定位链接。
1 |
grep " 404 " access.log | cut -d ' ' -f 7 | sort | uniq -c | sort -nr
|
404请求答复
1 |
cat access.log | awk '($9 ~ /404/)' | awk '{ print $7 }' | sort | uniq -c | sort -rn | head -n 25
|
独立请求IP地址
1 |
cat access.log | awk '{ print $1 }' | sort | uniq -c | sort -rn | head -n 25
|
独立请求IP地址对应的国家
安装依赖
1 |
apt-get install geoip-bin
|
1 |
cat access.log | awk '{ print $1 }' | sort | uniq -c | sort -rn | head -n 25 | awk '{ printf("%5dt%-15st", $1, $2); system("geoiplookup " $2 " | cut -d \: -f2 ") }'
|
查看谁在引用你的图片资源(省带宽)
1 |
awk -F" '($2 ~ /.(jpg|gif)/ && $4 !~ /^http://blog.topspeedsnail.com/){print $4}' access.log | sort | uniq -c | sort
|
列出空白的用户代理(user agent)
空用户代理有可能是爬虫脚本,当然也有可能是极其重视隐私的用户。用下面命令列出空用户代理对应的IP地址:
1 |
awk -F" '($6 ~ /^-?$/)' access.log | awk '{print $1}' | sort | uniq
|
负载过高
当你的网站在高负载下,你应该知道高负载是来自真正的用户还是其他什么东东。
- 配置问题或系统问题
- 有机器人频繁访问你的网站
- 拒接服务攻击
1 |
cat access.log | cut -d ' ' -f 1 | sort | uniq -c | sort -nr
|
Top 10 ip
1 |
cat access.log | awk '{ print $1 ; }' | sort | uniq -c | sort -n -r | head -n 10
|
每个状态码对应的数据传送量(单位KB)
1 |
cat access.log | awk ' { total[$9] += $10 } END { for (x in total) { printf "Status code %3d : %9.2f Kbn", x, total[x]/1024 } } '
|
Top 10 URI
1 |
cat access.log | awk -F" ' { print $4 } ' | grep -v '-' | grep -v 'http://www.adayinthelife' | sort | uniq -c | sort -rn | head -n 10
|
Top 10 user-agents
1 |
cat access.log | awk -F" ' { print $6 } ' | sort | uniq -c | sort -rn | head -n 10
|
最近10,000次点击
1 |
tail -10000 access.log| awk '{print $1}' | sort | uniq -c |sort -n
|
每天的请求量
1 |
awk '{print $4}' access.log | cut -d: -f1 | uniq -c
|
每小时的请求量
1 |
grep "15/Nov" access.log | cut -d[ -f2 | cut -d] -f1 | awk -F: '{print $2":00"}' | sort -n | uniq -c
|
注意修改日期参数
每分钟的请求量
1 |
grep "15/Nov/2015:07" access.log | cut -d[ -f2 | cut -d] -f1 | awk -F: '{print $2":"$3}' | sort -nk1 -nk2 | uniq -c | awk '{ if ($1 > 10) print $0}'
|
所有独立访客
1 |
cat access.log | awk '{print $1}' | sort | uniq -c | wc -l
|
今天所有独立访客
1 |
cat access.log | grep `date '+%e/%b/%G'` | awk '{print $1}' | sort | uniq -c | wc -l
|
这个月所有独立访客
1 |
cat access.* | grep `date '+%b/%G'` | awk '{print $1}' | sort | uniq -c | wc -l
|
所有独立访客-指定日期
1 |
cat access.* | grep 15/Nov/2015 | awk '{print $1}' | sort | uniq -c | wc -l
|
所有独立访客-指定月份
1 |
cat access.* | grep Nov/2015 | awk '{print $1}' | sort | uniq -c | wc -l
|
IP对应的请求个数
1 |
cat access.log | awk '{print "requests from " $1}' | sort | uniq -c | sort
|
最受欢迎的URL
1 |
cat access.log | awk '{ print $7 }' | sort | uniq -c | sort -rn | head -n 25
|
实时查看请求
1 |
tailf access.log | awk '{ printf("%-15st%st%st%sn", $1, $6, $9, $7) }'
|
独立IP地址
1 |
cat access.log | awk '{print $1}' | sort | uniq
|
带时间戳的独立IP地址
1 |
cat access.log | awk '{print $1 " " $4}' | sort | uniq
|
独立IP地址和浏览器
1 |
cat access.log | awk '{print $1 " " $12 " " $19}' | sort | uniq
|
独立IP地址和操作系统
1 |
cat access.log | awk '{print $1 " " $13}' | sort | uniq
|