使用c++統計pv uv

使用c++讀取日誌統計pv uv

在linux系統下通過c++讀取日誌文件,統計pv uv。

代碼

main.cpp 文件如下, 執行下面命令編譯
g++ -o sumary main.cpp

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <map>

/**
 * 判斷字符串 src 裏面是否包含 dest
 */
bool string_contains(std::string & src, std::string dest){
    std::size_t idx = src.find(dest);
    if(idx != std::string::npos){
        return true;
    }else{
        return false;
    }
}

int main(int argc, char * argv[]){
    std::cout << argc;
    std::vector<std::string> vec;
    if(argc > 1){
        for(int i=1;i<argc;i++){
            vec.push_back(argv[i]);
        }
    }
    std::ifstream fin;
    std::map<std::string, long> sumaryMap;

    for(auto v:vec){
        std::map<std::string, long> uniqMap;
        //std::cout << "filename:" << v << std::endl;
        fin.open(v);
        std::string line;
        long countHttp = 0;
        while(std::getline(fin,line)){
            if(!string_contains(line, "stat_http")){
                continue;
            }

            std::string wdEnd = line.substr(line.find("_wd=")+4);
            std::string wd = wdEnd.substr(0, wdEnd.find("&"));
            //std::cout << wdEnd << std::endl;
            //std::cout << wd << std::endl;
            if(uniqMap.count(wd) == 0){
                uniqMap.insert(std::pair<std::string,long>(wd, 1));
            }else{
                uniqMap[wd] = uniqMap[wd] + 1;
            }
            countHttp++;
            // std::cout << line <<  std::endl;
        }
        
        sumaryMap.insert(std::pair<std::string,long>(v, countHttp));
        fin.close();
        /*
        for(auto m:uniqMap){
            std::cout << m.first << ":" << m.second << std::endl;
        }
        */
        std::cout << v << "\tuv:"  << uniqMap.size() << std::endl;
    }
    for(auto m:sumaryMap){
        std::cout << m.first << "\tpv:" << m.second << std::endl;
    }

    return 0;
}

日誌文件按天存儲,例如 data.log-20190621, data.log-20190622。

統計pv uv命令如下:

./sumary  /data/log/data.log-201906*

代碼思路

  1. 先將所有命令行參數中的文件保存到vector, 然後逐個日誌文件處理
  2. 讀取文件,過濾 包含 stat_http 的,如果一行中有 stat_http,說明是請求行
  3. 解析 _wd 參數的值,每個客戶端的_wd參數是相同的,統計這個值就是uv
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章