网站流量日志自定义采集

网站流量日志自定义采集

1 原理分析

​ 用户的行为会触发浏览器对被统计页面的一个http请求,比如打开一个网站,当页面加载时,页面中的埋点javascript就会被执行。

​ 埋点是指:预先在网页中加入小段javascript代码,这个代码片段会独立的创建一个script标签,并将scr属性指向一个单独的js文件,这个js会被浏览器请求到并执行,这个js就是真正的数据收集脚本。

​ 数据收集完之后,js会通过http参数的方式发送给后端的一个数据收集脚本,通常是一个伪装成图片的动态脚本,后端脚本解析参数并按固定的格式记录到日志上,同时也会根据需求在http响应中种植一些用于追踪的cookie。

2 详细实现

2.1 埋点

​ 埋点:是网站分析的一种常用的数据采集方法,核心就是在需要采集的关键点植入统计代码,进行数据的采集

<script type="text/javascript">
var _maq = _maq || [];
_maq.push(['_setAccount', 'UA-XXXXX-X']);
(function() {
var ma = document.createElement('script'); ma.type =
'text/javascript'; ma.async = true;
ma.src = ('https:' == document.location.protocol ?
'https://ssl' : 'http://www') + '.google-analytics.com/ma.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore( m a, s);
})();
</script>

在这个代码块中

_map是全局数组,用于放置各种配置

后面跟的是一个匿名函数,它的目的是为了引入一个外部的js(ma.js),方式你是通过文本操作创建script并根据协议将src指向对应的ma.js,最后将这个元素插入到页面的dom树上。

2.2 前端脚本

当数据收集脚本ma.js被请求后就会执行,他的执行流程如下

1 通过浏览器内置的JavaScript对象收集信息,如页面信息,用户信息,cookie信息等。

2 解析_map数组,收集配置信息,这里包括了用户自定义的事件跟踪,业务数据等

3 将上面两步得到的数据按指定格式解析并拼接(get请求参数)

4 请求后端脚本,将信息放在http request参数中携带给后端脚本

​ 由于js请求后端脚本常用的方法是ajax,但是ajax是不能跨域访问的,通用的方法是js脚本创建一个image对象,在image对象的src属性下指向后端脚本并携带参数,此时实现了跨域请求后端,这也是为什么后端脚本要伪装成GIF文件的原因。

整个脚本是放在匿名函数里的,不会污染全局环境

2.3 后端脚本

他是一个伪装成GIF文件的脚本,执行流程如下

1 解析http请求得到参数

2 从Web服务器中获取一些客户端无法得到的数据,例如访客ip等

3 将信息格式写入日志

4 生成一副1x1的GIF图片作为响应内容并将响应头的content-type改为image/gif

5 在响应头中通过set-cookie设置一些需要的cookie信息。

2.4 日志收集

​ 我们使用 nginx 的 的 access_log 做日志收集,不过有个问题就是 nginx 配置本身的逻辑表达能力有限,所以选用 OpenResty 做这个事情。
​ OpenResty 是一个基于 Nginx 扩展出的高性能应用开发平台,内部集成了诸多有用的模块,其中的核心是通过 ngx_lua 模块集成了 Lua,从而在 nginx 配置文件中可以通过 Lua 来表述业务。
​ Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

2.5 日志格式

日志格式主要考虑日志分隔符,一般会有以下几种选择:
固定数量的字符、制表符分隔符、空格分隔符、其他一个或多个字符、特定的开始和结束文本。

2.6 日志切分

日志收集系统访问日志时间一长文件变得很大,而且日志放在一个文件不便于管理

猜你喜欢

转载自blog.csdn.net/weixin_42737141/article/details/81585028