1. 程式人生 > >資料收集---web訪問日誌收集與統計

資料收集---web訪問日誌收集與統計

本文轉載自 http://blog.csdn.net/hugolyl/article/details/50404478
- 話說web訪問日誌,很多同學對百度統計,谷歌統計(google analytics)很熟悉,就是加點js程式碼埋點,然後很方便可以從百度等獲得網站的訪問情況統計。這種方式的確是很方便,自己可以不用管日誌的資料,對系統的影響也很小,還可以增加網站排名(?),哈哈,總之,是很方便。如果想了解其工作原理?如果想自己來收集儲存這個資料呢?我們一起來看看這個過程吧,做一個自己的統計工具。下面我們來說說整個步驟:

  1. 我有一個網站頁面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>
  1. 這個頁面一被瀏覽器執行,很明顯瀏覽器會觸發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 &quot;%r&quot; %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之類的來處理日誌