获得离线日志文件后,您可以使用命令行工具来快速解析日志文件,提取访问量TOP10的IP地址、User-Agent和Referer信息。本文为您介绍如何在Linux环境中,使用命令行工具分析CDN的离线访问日志。
前提条件
已下载离线日志,具体请参见下载离线日志。
使用说明
日志命名规则:加速域名_年_月_日_开始时间_结束时间[扩展字段].gz,扩展字段以下划线(_)开头。例如
aliyundoc.com_2018_10_30_000000_010000_xx.gz
。说明扩展字段可能不存在,例如
aliyundoc.com_2018_10_30_000000_010000.gz
。日志示例
[9/Jun/2015:01:58:09 +0800] 10.10.10.10 - 1542 "-" "GET http://www.aliyun.com/index.html" 200 191 2830 MISS "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://example.com/robot/)" "text/html"
解析日志
收集和准备日志数据
下载离线日志,可得到
aliyundoc.com_2018_10_30_000000_010000.gz
的日志文件。上传日志文件至本地Linux系统服务器。
登录本地Linux系统服务器,执行如下命令,解压日志文件。
gzip -d aliyundoc.com_2018_10_30_000000_010000.gz
解压后得到一个文件名为
aliyundoc.com_2018_10_30_000000_010000
的日志文件。
识别和过滤异常行为
检查请求量
您可以通过分析离线日志数据中的IP请求次数来识别异常请求量的情况。通常请求量异常会具有如下几个特征:
异常高的请求量:对单一源IP的访问频次进行深度审查,若检测到某IP地址在特定时段内发起的请求量显著偏离常态值,此情况高度疑似为流量盗用行为。
短时间内大量请求:突然的流量峰值或者异常的周期性请求模式。
统计访问前十IP地址。
cat [$Log_Txt] | awk '{print $3}' |sort|uniq -c|sort -nr |head -10
说明awk '{print $3}'
: 提取日志文件的第3列,即IP地址。(列之间使用空格隔开)。sort
: 排序IP地址。uniq -c
: 统计每个IP地址的出现次数。sort -nr
: 按统计次数进行降序排列。head -n 10
: 获取出现次数最多的前10个IP地址。[$Log_Txt]
:替换对应的日志文件名称,例如aliyundoc.com_xxxxxxx
。
用户代理分析
您可以通过分析离线日志数据中的请求User-Agent来识别异常请求量的情况。通常请求User-Agent异常会有如下几个特征:
异常或伪造的User-Agent:很多盗刷工具会使用默认或伪造的User-Agent,可以通过筛选不常见和可疑的或为空User-Agent进行分析。
提取和统计User-Agent。
grep -o '"Mozilla[^"]*' [$Log_Txt] | cut -d'"' -f2 | sort | uniq -c | sort -nr | head -n 10
可通过排除常见的User-Agent来筛选可疑的User-Agent。
grep -v -E "Firefox|Chrome|Safari|Edge" [$Log_Txt]
统计User-Agent为空的行数,即访问次数。
awk '!/Mozilla/' [$Log_Txt] | wc -l
说明grep -o
:只输出匹配的内容。grep -v -E
:显示符合条件的字符。wc -l
:统计数量。
请求模式分析
您可以通过分析离线日志数据中的URL请求量来识别异常请求量的情况。通常URL请求异常会具有如下几个特征:
URL相似度高:盗刷流量通常会请求大量类似或相同的URL,可以通过分析URL模式发现异常请求。
高比例访问特定资源类型:重点分析被频繁访问的资源(如图片、CSS、JS等),如果某些特定资源被异常大量访问,也可能是盗刷流量。
统计访问前十的url。
grep -oP '"https?://[^"]+"' [$Log_Txt] | sort | uniq -c | sort -nr | head -n 10
响应码分析
您可以通过分析离线日志数据中的请求状态码来识别异常请求量的情况。通常请求状态码异常会具有下几个特征:
高比例的4xx或5xx响应:如果某一IP地址产生大量的4xx或5xx响应码,可能表明该地址在进行恶意爬取尝试。
统计不同状态码出现的次数。
awk '{print $9}' [$Log_Txt] | sort | uniq -c | sort -nr
统计状态码为400前十IP。
grep ' 400 ' [$Log_Txt] | awk '{print $3}' | sort | uniq -c | sort -nr | head -n 10