本文转载自 http://blog.csdn.net/hugolyl/article/details/50404478
- 话说web访问日志,很多同学对百度统计,谷歌统计(google analytics)很熟悉,就是加点js代码埋点,然后很方便可以从百度等获得网站的访问情况统计。这种方式的确是很方便,自己可以不用管日志的数据,对系统的影响也很小,还可以增加网站排名(?),哈哈,总之,是很方便。如果想了解其工作原理?如果想自己来收集保存这个数据呢?我们一起来看看这个过程吧,做一个自己的统计工具。下面我们来说说整个步骤:
- 我有一个网站页面test.html,添加埋点。
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<p>这里有很多东西,很多好看的yellow的图片</p> <!---下面的js就是埋点了,有木有似曾相识的赶脚!--->
<script type="text/javascript">
var _maq = _maq || [];
_maq.push(['_setAccount', 'testname']);
(function() {
var ma = document.createElement('script'); ma.type = 'text/javascript'; ma.async = true;
ma.src = ('https:' == document.location.protocol ? 'https://localhost:8080' : 'http://localhost:8080') + '/ma.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ma, s);
})();
</script>
</body>
</html>
- 这个页面一被浏览器运行,很明显浏览器会触发js脚本,去异步加载访问http://localhost:8080/ma.js。这个就是我们的统计脚本,这个是关键核心哦!
这个脚本运行在tomcat中,我测试用的。ma.js样子是这样的:
(function () {
var params = {};
//Document对象数据
if(document) {
params.domain = document.domain || '';
params.url = document.URL || '';
params.title = document.title || '';
params.referrer = document.referrer || '';
}
//Window对象数据
if(window && window.screen) {
params.sh = window.screen.height || 0;
params.sw = window.screen.width || 0;
params.cd = window.screen.colorDepth || 0;
}
//navigator对象数据
if(navigator) {
params.lang = navigator.language || '';
params.apn = navigator.appName || '';
params.apv = navigator.appVersion || '';
params.apc = navigator.appCodeName || '';
params.ua = navigator.userAgent || '';
}
//解析_maq配置
if(_maq) {
for(var i in _maq) {
switch(_maq[i][0]) {
case '_setAccount':
params.account = _maq[i][1];
break;
default:
break;
}
}
}
//拼接参数串
var args = '';
for(var i in params) {
if(args != '') {
args += '&';
}
args += i + '=' + encodeURIComponent(params[i]);
}
//通过Image对象请求后端脚本
var img = new Image(1, 1);
img.src = 'http://localhost:8080/1.gif?' + args;
})();
这里面也很好理解,通过js获得大堆数据,包括自定义的参数,然后拼接乘参数串,加到一个gif图片后面作为参数,可怜的gif文件其实什么也没有,就是用一个1*1的空白图片。访问了我们统计放在的图片,我的服务器当然会记录下来这个过程,因为的的tomcat开启了访问日志记录。
conf/server.xml打开注释掉的
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
这样我们就可以到日志记录文件里面去找结果了:
0:0:0:0:0:0:0:1 - - [11/Dec/2015:10:58:25 +0800] "GET /1.gif?domain=&url=file%3A%2F%2F%2FD%3A%2Ftmp%2Ftest.html&title=Document&referrer=&sh=768&sw=1366&cd=24&lang=zh-CN&apn=Netscape&apv=5.0%20(Windows)&apc=Mozilla&ua=Mozilla%2F5.0%20(Windows%20NT%206.1%3B%20WOW64%3B%20rv%3A42.0)%20Gecko%2F20100101%20Firefox%2F42.0&account=testname HTTP/1.1" 200 808
0:0:0:0:0:0:0:1 - - [11/Dec/2015:11:00:06 +0800] "GET /ma.js HTTP/1.1" 304 -
0:0:0:0:0:0:0:1 - - [11/Dec/2015:11:00:06 +0800] "GET /1.gif?domain=&url=file%3A%2F%2F%2FD%3A%2Ftmp%2Ftest.html&title=Document&referrer=&sh=768&sw=1366&cd=24&lang=zh-CN&apn=Netscape&apv=5.0%20(Windows)&apc=Mozilla&ua=Mozilla%2F5.0%20(Windows%20NT%206.1%3B%20WOW64%3B%20rv%3A42.0)%20Gecko%2F20100101%20Firefox%2F42.0&account=testname HTTP/1.1" 200 808
果然看到了谁从哪里通过什么设备在什么时候访问了test.html,这就达到了我们要记录的目的!!!
- 想通过图表来做个统计,按时间按设备等等方式来统计,想百度Google统计一样。这个好办,把日志文件抽取出来,写到数据库,然后写SQL来统计,剩下的你懂的,有了数据都好办了。
这个统计还可以用在其他的地方,比如推荐引擎
这个就简单说到这了,下次来个kafka、flume之类的来处理日志