网站日志流量分析系统(离线分析学习)

一、业务背景

  网站流量统计是改进网站服务的重要手段之一,通过获取用户在网站的行为数据,进行分析,从而得到有价值的信息,并基于这些信息对网站进行改进。

二、业务需求

①PV(Page View)

  访问量:也叫点击量,即一天之内整个网站中的页面被访问的次数(对同一个页面重复访问也记为不同的PV)

②UV(Uniquer Visitor)

  独立访客数:即一天之内访问网站的人数(同一个人在一天之内访问网站多次,也只能算一个UV)

③VV(Visit View)

  会话总数:即一天之内会话总的数量,所谓一次会话,指的是从访问第一个页面开始,会话开始,直到访问最后一个页面结束,关闭所有页面,会话结束;会话可以认为在访问第一个页面时开始,访问所有页面完成并关闭或超过指定时长没有后续访问都认为会话结束。

三、系统架构图

  转载来自:https://www.cnblogs.com/hzhuxin/p/11152805.html,如有侵权,请联系删除。

  

四、日志收集

网页埋点

测试模拟一个网站系统,在其中需要埋点的页面中的<head></head>中加入如下代码:

 <script src="maidian.js"></script>   注:maidian.js 就是需埋点的 js 文件

/**函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。*/
function ar_encode(str)
{
    //进行URL编码
    return encodeURI(str);
}

/**屏幕分辨率*/
function ar_get_screen()
{
    var c = "";

    if (self.screen) {
        c = screen.width+"x"+screen.height;
    }

    return c;
}

/**颜色质量*/
function ar_get_color()
{
    var c = ""; 

    if (self.screen) {
        c = screen.colorDepth+"-bit";
    }

    return c;
}

/**返回当前的浏览器语言*/
function ar_get_language()
{
    var l = "";
    var n = navigator;

    if (n.language) {
        l = n.language.toLowerCase();
    }
    else
    if (n.browserLanguage) {
        l = n.browserLanguage.toLowerCase();
    }

    return l;
}

/**返回浏览器类型IE,Firefox*/
function ar_get_agent()
{
    var a = "";
    var n = navigator;

    if (n.userAgent) {
        a = n.userAgent;
    }

    return a;
}

/**方法可返回一个布尔值,该值指示浏览器是否支持并启用了Java*/
function ar_get_jvm_enabled()
{
    var j = "";
    var n = navigator;

    j = n.javaEnabled() ? 1 : 0;

    return j;
}

/**返回浏览器是否支持(启用)cookie */
function ar_get_cookie_enabled()
{
    var c = "";
    var n = navigator;
    c = n.cookieEnabled ? 1 : 0;

    return c;
}

/**检测浏览器是否支持Flash或有Flash插件*/
function ar_get_flash_ver()
{
    var f="",n=navigator;

    if (n.plugins && n.plugins.length) {
        for (var ii=0;ii<n.plugins.length;ii++) {
            if (n.plugins[ii].name.indexOf(‘Shockwave Flash‘)!=-1) {
                f=n.plugins[ii].description.split(‘Shockwave Flash ‘)[1];
                break;
            }
        }
    }
    else
    if (window.ActiveXObject) {
        for (var ii=10;ii>=2;ii--) {
            try {
                var fl=eval("new ActiveXObject(‘ShockwaveFlash.ShockwaveFlash."+ii+"‘);");
                if (fl) {
                    f=ii + ‘.0‘;
                    break;
                }
            }
             catch(e) {}
        }
    }
    return f;
} 

/**匹配顶级域名*/
function ar_c_ctry_top_domain(str)
{
    var pattern = "/^aero$|^cat$|^coop$|^int$|^museum$|^pro$|^travel$|^xxx$|^com$|^net$|^gov$|^org$|^mil$|^edu$|^biz$|^info$|^name$|^ac$|^mil$|^co$|^ed$|^gv$|^nt$|^bj$|^hz$|^sh$|^tj$|^cq$|^he$|^nm$|^ln$|^jl$|^hl$|^js$|^zj$|^ah$|^hb$|^hn$|^gd$|^gx$|^hi$|^sc$|^gz$|^yn$|^xz$|^sn$|^gs$|^qh$|^nx$|^xj$|^tw$|^hk$|^mo$|^fj$|^ha$|^jx$|^sd$|^sx$/i";

    if(str.match(pattern)){ return 1; }

    return 0;
}

/**处理域名地址*/
function ar_get_domain(host)
{
    //如果存在则截去域名开头的 "www."
    var d=host.replace(/^www\./, "");

    //剩余部分按照"."进行split操作,获取长度
    var ss=d.split(".");
    var l=ss.length;

    //如果长度为3,则为xxx.yyy.zz格式
    if(l == 3){
        //如果yyy为顶级域名,zz为次级域名,保留所有
        if(ar_c_ctry_top_domain(ss[1]) && ar_c_ctry_domain(ss[2])){
        }
        //否则只保留后两节
        else{
            d = ss[1]+"."+ss[2];
        }
    }
    //如果长度大于3
    else if(l >= 3){

        //如果host本身是个ip地址,则直接返回该ip地址为完整域名
        var ip_pat = "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$";
        if(host.match(ip_pat)){
            return d;
        }
        //如果host后两节为顶级域名及次级域名,则保留后三节
        if(ar_c_ctry_top_domain(ss[l-2]) && ar_c_ctry_domain(ss[l-1])) {
            d = ss[l-3]+"."+ss[l-2]+"."+ss[l-1];
        }
        //否则保留后两节
        else{
            d = ss[l-2]+"."+ss[l-1];
        }
    }

    return d;
}

/**返回cookie信息*/
function ar_get_cookie(name)
{
    //获取所有cookie信息
    var co=document.cookie;

    //如果名字是个空 返回所有cookie信息
    if (name == "") {
        return co;
    }

    //名字不为空 则在所有的cookie中查找这个名字的cookie
    var mn=name+"=";
    var b,e;
    b=co.indexOf(mn);

    //没有找到这个名字的cookie 则返回空
    if (b < 0) {
        return "";
    }

    //找到了这个名字的cookie 获取cookie的值返回
    e=co.indexOf(";", b+name.length);
    if (e < 0) {
        return co.substring(b+name.length + 1);
    }
    else {
        return co.substring(b+name.length + 1, e);
    }
}

/**
     设置cookie信息
    操作符:
        0 表示不设置超时时间 cookie是一个会话级别的cookie  cookie信息保存在浏览器内存当中 浏览器关闭时cookie消失
        1 表示设置超时时间为10年以后 cookie会一直保存在浏览器的临时文件夹里 直到超时时间到来 或用户手动清空cookie为止
        2 表示设置超时时间为1个小时以后 cookie会一直保存在浏览器的临时文件夹里 直到超时时间到来 或用户手动清空cookie为止
 * */
function ar_set_cookie(name, val, cotp)
{
    var date=new Date;
    var year=date.getFullYear();
    var hour=date.getHours(); 

    var cookie="";

    if (cotp == 0) {
        cookie=name+"="+val+";";
    }
    else if (cotp == 1) {
        year=year+10;
        date.setYear(year);
        cookie=name+"="+val+";expires="+date.toGMTString()+";";
    }
    else if (cotp == 2) {
        hour=hour+1;
        date.setHours(hour);
        cookie=name+"="+val+";expires="+date.toGMTString()+";";
    } 

    var d=ar_get_domain(document.domain);
    if(d != ""){
        cookie +="domain="+d+";";
    }
    cookie +="path="+"/;";

    document.cookie=cookie;
}

/**返回客户端时间*/
function ar_get_stm()
{
    return new Date().getTime();
} 

/**返回指定个数的随机数字串*/
function ar_get_random(n) {
    var str = "";
    for (var i = 0; i < n; i ++) {
        str += String(parseInt(Math.random() * 10));
    }
    return str;
}

/* main function */
function ar_main() {

    //收集完日志 提交到的路径
    var dest_path   = "http://192.168.229.130/proxy?";
    var expire_time = 30 * 60 * 1000;//会话超时时长

    //处理uv
    //--获取cookie ar_stat_uv的值
    var uv_str = ar_get_cookie("ar_stat_uv");
    var uv_id = "";
    //--如果cookie ar_stat_uv的值为空
    if (uv_str == ""){
        //--为这个新uv配置id,为一个长度20的随机数字
        uv_id = ar_get_random(20);
        //--设置cookie ar_stat_uv 保存时间为10年
        ar_set_cookie("ar_stat_uv", uv_id, 1);
    }
    //--如果cookie ar_stat_uv的值不为空
    else{
        //--获取uv_id
        uv_id  = uv_str;
    }

    //处理ss
    //--获取cookie ar_stat_ss
    var ss_stat = ar_get_cookie("ar_stat_ss");
    var ss_id = "";  //sessin id
    var ss_count = 0;   //session有效期内访问页面的次数
    var ss_time = "";
    //--如果cookie中不存在ar_stat_ss 说明是一次新的会话
    if (ss_stat == ""){
        //--随机生成长度为10的session id
        ss_id = ar_get_random(10);
        //--session有效期内页面访问次数为0
        ss_count = 0;
        //--当前事件
        ss_time = ar_get_stm()
    } else { //--如果cookie中存在ar_stat_ss
        //获取ss相关信息
        var items = ss_stat.split("_");
        //--ss_id
        ss_id  = items[0];
        //--ss_count
        ss_count  = parseInt(items[1]);
        //--ss_stm
        ss_time = items[2];

        //如果当前时间-当前会话上一次访问页面的时间>30分钟,虽然cookie还存在,但是其实已经超时了!仍然需要重新生成cookie
        if (ar_get_stm() - ss_time > expire_time) {
            //--重新生成会话id
            ss_id = ar_get_random(10);
            //--设置会话中的页面访问次数为0
            ss_count = 0;
            //--当前事件
            ss_time = ar_get_stm();
        }else{//--如果会话没有超时
            //--会话id不变
            //--设置会话中的页面方位次数+1
            ss_count = ss_count + 1;
            ss_time = ar_get_stm();
        }
    }
    //--重新拼接cookie ar_stat_ss的值
    value = ss_id+"_"+ss_count+"_"+ss_time;
    ar_set_cookie("ar_stat_ss", value, 0); 

    //当前地址
    var url = document.URL;
    url = ar_encode(String(url)); 

    //当前资源名
    var urlname = document.URL.substring(document.URL.lastIndexOf("/")+1);
    urlname = ar_encode(String(urlname)); 

    //返回导航到当前网页的超链接所在网页的URL
    var ref = document.referrer;
    ref = ar_encode(String(ref)); 

    //网页标题
    var title = document.title;
    title = ar_encode(String(title)); 

    //网页字符集
    var charset = document.charset;
    charset = ar_encode(String(charset)); 

    //屏幕信息
    var screen = ar_get_screen();
    screen = ar_encode(String(screen)); 

    //颜色信息
    var color =ar_get_color();
    color =ar_encode(String(color)); 

    //语言信息
    var language = ar_get_language();
    language = ar_encode(String(language));

     //浏览器类型
    var agent =ar_get_agent();
    agent =ar_encode(String(agent));

    //浏览器是否支持并启用了java
    var jvm_enabled =ar_get_jvm_enabled();
    jvm_enabled =ar_encode(String(jvm_enabled)); 

    //浏览器是否支持并启用了cookie
    var cookie_enabled =ar_get_cookie_enabled();
    cookie_enabled =ar_encode(String(cookie_enabled)); 

    //浏览器flash版本
    var flash_ver = ar_get_flash_ver();
    flash_ver = ar_encode(String(flash_ver)); 

    //当前ss状态 格式为"会话id_会话次数_当前时间"
    var stat_ss = ss_id+"_"+ss_count+"_"+ss_time;
    //拼接访问地址 增加如上信息
    dest=dest_path+"url="+url+"&urlname="+urlname+"&title="+title+"&chset="+charset+"&scr="+screen+"&col="+color+"&lg="+language+"&je="+jvm_enabled+"&ce="+cookie_enabled+"&fv="+flash_ver+"&cnv="+String(Math.random())+"&ref="+ref+"&uagent="+agent+"&stat_uv="+uv_id+"&stat_ss="+stat_ss;

    //通过插入图片访问该地址
    document.getElementsByTagName("body")[0].innerHTML += "<img src=\""+dest+"\" border=\"0\" width=\"1\" height=\"1\" />";

}

window.onload = function(){
    //触发main方法
    ar_main();
}

说明:

  ①var dest_path   = "http://192.168.229.130/proxy?"; 这里要改成日志服务器的地址

  ②网页埋点原理:js代码动态在页面中创建一个宽和高都是1px的图片,图片的地址指向了定义的日志服务器,

  document.getElementsByTagName("body")[0].innerHTML += "<img src=\""+dest+"\" border=\"0\" width=\"1\" height=\"1\" />";

原文地址:https://www.cnblogs.com/rmxd/p/11455810.html

时间: 2024-11-09 09:39:21

网站日志流量分析系统(离线分析学习)的相关文章

网站日志流量复杂分析

网站日志流量复杂分析 hadoop hive 需求 会话信息表: 键名 描述 对应Track表字段 session_id 会话ID sessionId,会话ID guid 访客id globel userId,独立访客ID,不清cookies时不会变化guid trackerU 访问的渠道id,取该会话中第一个trackerU trackerU 渠道 landing_url 着落页,第一个访问URL url landing_url_ref 着落页之前的页面,用于分析引流 refere user_

日志收集分析系统架构

日志收集分析系统架构   一.部署架构 日志收集系统一般包括如图所示三层.Web服务器层,日志收集层,日志存储层.Web服务器层是日志的来源,一般部署web应用供用户访问,产生日志,该节点上一般需要部署日志收集程序的agent.日志收集层手机web服务器产生的日志传输给日志存储层,存储层一般使用分布式文件系统HDFS,日志可以存储在hdfs上或者hbase上. 以scribe作为日志收集系统架构,scribe分为scribe agent和scribe server 以kafka作为日志收集系统架

大数据实战:用户流量分析系统

本文是结合hadoop中的mapreduce来对用户数据进行分析,统计用户的手机号码.上行流量.下行流量.总流量的信息,同时可以按照总流量大小对用户进行分组排序等.是一个非常简洁易用的hadoop项目,主要用户进一步加强对MapReduce的理解及实际应用.文末提供源数据采集文件和系统源码. 本案例非常适合hadoop初级人员学习以及想入门大数据.云计算.数据分析等领域的朋友进行学习. 一.待分析的数据源 以下是一个待分析的文本文件,里面有非常多的用户浏览信息,保扩用户手机号码,上网时间,机器序

logstash日志收集分析系统elasticsearch&kibana

logstash日志收集分析系统Logstash provides a powerful pipeline for storing, querying, and analyzing your logs. When using Elasticsearch as a backend data store and Kibana as a frontend reporting tool, Logstash acts as the workhorse. It includes an arsenal of

在linux中快速使用docker搭建ELK日志监控分析系统

在linux中使用docker安装ELK日志监控分析系统 网上的教程非常零散或者很多都已经过时了,我这里总结了相比于其他更新的日志系统搭建.并且使用docker镜像,更加简化了安装.在这开始之前先附上我的成功配置截图: linux的安装 linux的安装很简单,但是要使用docker必须安装centos7及以上,不然出现的各种兼容性问题自行百度解决.这里有两种方法: 如果是学生可以购买阿里或者腾讯的linux服务器,简单方便,每个月只要10元钱,其实挺划算的.这是阿里linux的购买地址:htt

基于Elasticsearch+Fluentd+Kibana的日志收集分析系统

我们平时分析log直接在日志文件中 grep.awk 就可以获得自己想要的信息,此方法效率低下,生产中需要集中化的日志管理,所有服务器上的日志收集汇总 Elasticsearch一个节点(node)就是一个Elasticsearch实例,一个集群(cluster)由一个或多个节点组成,它们具有相同的cluster.name,它们协同工作,分享数据和负载.当加入新的节点或者删除一个节点时,集群就会感知到并平衡数据.集群中一个节点会被选举为主节点(master),它将临时管理集群级别的一些变更,例如

使用百度统计对网站进行流量分析和统计

在自己建立一个网站后,最关心的问题就是到底有多少人访问了我的网站,也就是我的网站的流量到底是多少.以此可以不断进行完善和优化.这里将会使用百度的两个统计工具:百度统计和百度站长来进行分析.以我自己的建立的基于Hexo博客网站 :http://www.chenyufengweb.com   .为例. (一)百度统计 (1)进入百度统计首页,http://tongji.baidu.com/web/welcome/login    .登录进入下面的网站统计. . (2)然后进入上方的网站中心页面,下面

elkb+redis建立日志收集分析系统

一.ELKB说明 elastic提供了一套非常高级的工具ELKB来满足以上这几个需求.ELKB指的是用于日志分析或者说数据分析的四个软件,各自拥有独立的功能又可以组合在一起.先来简单介绍一下这四个软件. Elastic Search: 从名称可以看出,Elastic Search 是用来进行搜索的,提供数据以及相应的配置信息(什么字段是什么数据类型,哪些字段可以检索等),然后你就可以自由地使用API搜索你的数据. Logstash:.日志文件基本上都是每行一条,每一条里面有各种信息,这个软件的功

2018年ElasticSearch6.2.2教程ELK搭建日志采集分析系统(教程详情)

章节一 2018年 ELK课程计划和效果演示1.课程安排和效果演示简介:课程介绍和主要知识点说明,ES搜索接口演示,部署的ELK项目演示es: localhost:9200kibana http://localhost:5601/ 章节二 elasticSearch 6.2版本基础讲解到阿里云部署实战 2.搜索引擎知识介绍和相关框架简介:介绍搜索的基本概念,市面上主流的搜索框架elasticSearch和solr等对比什么是搜索:在海量信息中获取我们想要的信息传统做法:1.文档中使用系统的Fin