统计后台显示昨天两千八百次浏览,服务器日志里数出来四千多条页面请求,差了将近一半。第一反应通常是“工具不准”。其实这两个数本来就不该相等,它们统计的东西压根不是一回事。搞清楚差在哪里,比争论谁准有用得多。
一、两者的统计对象根本不同
服务器日志记的是“服务器收到的每一个请求”,包括页面、图片、样式、脚本、接口,还包括机器人。统计工具记的是“浏览器执行了统计脚本的那一次页面浏览”。一个在入口记账,一个在用户端记账,中间隔着网络、浏览器和一堆过滤规则。
所以正常状态就是日志偏多。差多少没有标准答案,不同站点差异很大,关键看差异的结构是不是稳定。如果某天差异突然变了,那才是要查的信号。
还有一种干扰项容易被忽略:浏览器的预加载和 CDN 的预取。有些浏览器会提前请求页面上可能点击的链接,服务器把这些记账了,用户其实没看过。量小时可以不管,量大时要在清洗规则里一并排除。
二、差异一:机器人流量,日志有、统计没有
各类搜索引擎蜘蛛、监控探针、扫描器都会请求你的页面,但它们不执行 JavaScript,统计脚本自然不会上报。这部分请求全部落在日志里。访问量不大的站,蜘蛛请求占比可能相当可观,尤其收录量大的站,蜘蛛抓取是持续的。
想看清楚这块有多少,在日志里按 UA 过滤一下就知道。把常见的蜘蛛标识列出来筛一遍,数字往往超出预期。
三、差异二:没执行脚本的访问
用户禁用 JavaScript、浏览器插件拦截、老旧浏览器兼容问题、页面还没加载完就关掉了,这些情况页面已经请求了,服务器记了一笔,但脚本没跑成,统计工具就没记。
技术类站点、面向开发者群体的站,禁用脚本的比例会偏高一些。这类差异是天然的,没法消除,只能心里有数。
四、差异三:缓存与 CDN 让日志偏多或偏少
开了 CDN 之后,日志的来源变得复杂。如果日志记的是源站收到的请求,缓存命中的那些访问根本不会到源站,日志反而会比统计工具少。反过来,如果日志记的是 CDN 边缘节点的全部请求,里面会混进大量缓存回源、健康检查,日志又会偏多。
判断方法很简单:看日志里的来源 IP 是不是 CDN 节点的地址。如果是,说明你拿到的是边缘日志,需要先剔除健康检查和缓存探测请求,再跟统计工具比。
五、差异四:日志里混着静态资源和错误页
一张页面打开,浏览器要请求 HTML、图片、样式、脚本好几个文件,日志会全部记下来。统计工具只算一次页面浏览。所以直接拿日志行数跟浏览量比,等于拿菜的数量比一桌饭的数量,压根没法比。
正确做法是先给日志做一次口径清洗:剔除静态资源、剔除蜘蛛、剔除 4xx 和 5xx,剩下的才算“页面浏览”的近似值。这段脚本做的就是这件事:
# 让日志口径接近统计工具:排除静态资源、蜘蛛和错误页,只算页面浏览
import re
LOG = "access.log"
BOT = re.compile(r"(Baiduspider|bingbot|Googlebot|Sogou|360Spider|Spider|Bot)", re.I)
STATIC = re.compile(r"\.(css|js|png|jpg|jpeg|gif|ico|svg|woff2?|ttf|mp4|webp)(\?|$)", re.I)
LINE = re.compile(r'^(\S+).*?"(?:GET|POST) ([^"]*?)" (\d{3}) \d+ "[^"]*" "([^"]*)"')
pv = bot = static = err = 0
with open(LOG, encoding="utf-8", errors="ignore") as f:
for line in f:
m = LINE.match(line)
if not m:
continue
path, code, ua = m.group(2), m.group(3), m.group(4)
if BOT.search(ua):
bot += 1
continue
if STATIC.search(path.split("?")[0]):
static += 1
continue
if code.startswith(("4", "5")):
err += 1
continue
pv += 1
print("页面 PV(接近统计口径):", pv)
print("已排除 蜘蛛:", bot, " 静态资源:", static, " 错误页:", err)
清洗完再比,差距会从几倍缩到很小。如果清洗之后仍然差得离谱,那就该怀疑埋码或者日志采集本身有重复写入的问题了。
六、把口径调一致再比,比完看趋势
两个数永远对不齐,所以别追求相等,追求“比值稳定”。每天记录一次两边清洗后的数,算一个比值,连续记两周。比值稳定说明两边都在正常工作;比值突变,说明某一侧出了问题。
实践里更常见的情况是:比值慢慢变大,查下来是埋码被漏了一部分页面;比值突然变小,查下来是日志写入重复了。这种细微变化不会自己跳出来提醒你,只能靠长期盯着这个比值。
最后一句实在话:日志是事实的底稿,统计工具是加工后的报表。要追根究底用日志,要看趋势和用户行为用统计工具,别指望其中一个替另一个的活。
相关阅读:
A5创业网 版权所有