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
)
|
如执行用户代理命令
扫描二维码关注公众号,回复:
1801439 查看本文章
下面是一些实用的例子:
列出所有用户代理(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
|