又拍云日志系统简介

又拍云提示了日志分析和日志下载功能,通过后台可以根据需求查询访问最多的 IP 或 URL,以此设置一些策略,达到限制重复 IP 访问的效果

后台功能简介

后台点击工具箱–日志管理

可以看到全网加速和直播加速日志,切换到日志分析,可以选择对应的服务名和域名,然后按类型进行划分并且选择日志进行查询

  • 热门引用页面
  • 热门文件
  • 热门客户端
  • 热门 IP
  • 文件大小
  • 资源状态

比如,我们希望看下2017-06-23哪个 IP 访问次数最多。可以选择热门 IP 进行查询。如果同一个 IP 请求特别多,可以在防盗链中将对于的Ip 进行限制或者加入黑名单

此外,还可以下载日志到本地进行分析,又拍云的日志是一小时一出,比如1点到2点之间的日志,会在2点半左右更新在后台。

下载日志

比如我们将23号一天的日志全部下载到本地,然后将日志文件合并为一个文件

➜  Downloads cat *.gz >> awen.gz
➜  Downloads ll awen.gz
-rw-r--r--  1 wenjun  staff    15K  6 24 13:26 awen.gz

然后解压

➜  Downloads gunzip awen.gz
➜  Downloads ll awen
-rw-r--r--  1 wenjun  staff   170K  6 24 13:26 awen

然后查看日志

日志字段含义

66.249.66.11 - - [23/Jun/2017:00:50:08 +0800] "GET https://file.awen.me/2017-06-16-091922.jpg!awen) HTTP/1.1" 200 64922 "-" "Googlebot-Image/1.0" "image/jpeg" 0 Miss "C/200" Static "max-age=1296000" 1.901 204.237.206.134

从左到右分别是

  • 客户端 IP: 66.249.66.11
  • 请求时间: [23/Jun/2017:00:50:08 +0800]
  • 请求方法: GET
  • 请求的 URL:https://file.awen.me/2017-06-16-091922.jpg!awen)
  • 状态码:200
  • 请求的字节:64922
  • User-agent:Googlebot-Image/1.0”
  • 文件类型:”image/jpeg”
  • 0 0 表示客户端向服务器发起请求的内容大小
  • 是否缓存命中 CDN Miss 表示未命中
  • C/200 表示回源站响应200,如果是 U/200 则表示又拍云存储类型,如果你是自主源站,显示为 U,则是开启了镜像功能,文件被存储在 CDN
  • Static 表示静态请求
  • “max-age=1296000” 缓存控制头信息
  • 节点请求耗时:1.901
  • CDN 节点:204.237.206.134

日志格式

$remote_addr - $remote_user [$time_local] "$request_method $scheme://$http_host$uri$querystring $server_protocol" $status $body_bytes_sent "$http_referer" "$http_user_agent" $content_type $request_content_length $cache_hit $source_code $is_dynamic $cache_control $request_time $edge_server_ip

过滤日志

通常过滤日志可以使用 awk sed grep 进行处理

比如说我们希望看看哪个 IP 访问的最多,判断下和又拍云后台统计的 IP 对不对得上,可以按照如下步骤操作

1.过滤日志的第一列,对 IP 进行排序统计

  ➜  Downloads cat awen | awk  '{print $1}' | sort| uniq -c |sort -r
132 60.186.217.92
108 115.231.100.106
 26 112.17.241.128
 20 116.237.32.67
 14 14.24.209.40
 14 115.192.21.157
 14 112.17.245.42
 14 101.226.79.182
 12 49.5.0.66
 11 153.37.114.107
  8 36.23.228.97
  7 36.35.35.97
  7 202.189.0.2
  7 125.121.41.81
  7 124.160.213.58
  7 117.136.0.254
  7 115.206.56.50
  7 115.193.173.10
  7 112.26.238.72
  7 112.10.109.202
  7 100.64.126.174
  6 61.151.226.202
  3 66.249.66.11
  3 223.155.233.4
  2 90.44.59.57
  2 171.8.70.8
  1 66.249.66.15
  1 42.156.138.103
  1 35.187.149.136
  1 220.181.108.95
  1 220.181.108.178
  1 220.181.108.154
  1 220.181.108.112
  1 202.200.151.142
  1 182.138.102.194
  1 119.62.42.104
  1 112.17.242.187

得到如上的结果

cat awen | awk  '{print $1}' | sort| uniq -c |sort -r

这个命令的意思是先用 awk 打印$1,awk 默认按空格进行分割,$1表示第一列,然后获取到第一列后 进行排序在统计,uniq只能对相邻的行进行比较。所以要先排序。然后在sort -c 参数进行一次倒序排列得到如上的结果,可以看到60.186.217.92 在23号这天访问了132次。

132 60.186.217.92
108 115.231.100.106

我们去后台查下,发现是对上了,就说明统计没有出现错误的。

其实如果日志量大的话,比如超过1G cat 会很耗内存,不如直接 awk 节省资源

awk  '{print $1}' | sort| uniq -c |sort -r awen

那么如何统计流量呢?从日志看出,这个就稍微复杂点了,我们要对每个 IP 的流量进行统计,就是先要拿到 IP,然后在针对 IP 的请求字节进行统计计算,这里就要用到 awk 的循环和对列的相加了

➜  Downloads cat awen| grep ^60.186.217.92| awk 'BEGIN{total=0}{total+=$10/1024/1024}END{print total}'
8.90929

上面是针对 60.186.217.92 的这个IP 进行统计,对比下后台,计算结果也是没有错的

如果要统计所有的流量

➜  Downloads awk 'BEGIN{total=0}{total+=$10/1024/1024}END{print total}' awen
29.2603

发现一天的流量是20M,不过又拍云的计费是按地区和文件类型来计算的。比如国内和海外的计费价格是不一样的,动态和静态请求的计费也是不一样的。
其他的自行研究