整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          你還不懂java的日志系統(tǒng)嗎

          你還不懂java的日志系統(tǒng)嗎

          、背景

          在java的開發(fā)中,使用最多也繞不過去的一個話題就是日志,在程序中除了業(yè)務(wù)代碼外,使用最多的就是打印日志。經(jīng)常聽到的這樣一句話就是“打個日志調(diào)試下”,沒錯在日常的開發(fā)、調(diào)試過程中打印日志是常干的一件事,同時系統(tǒng)正常運行過程中必要的日志打印也是必須的。

          二、詳情

          在筆者剛接觸java程序的時候,打印日志經(jīng)常使用到到下面的代碼,

          System.out.println("hello log");

          我相信在不了解日志系統(tǒng)的前提下使用上述的方式是最多的,同時也是新手小白最常用的方式,筆者曾經(jīng)也是使用最多的。那么除了上述的方式還有其他的方式嗎?答案是肯定的

          2.1、java自帶的日志

          在java的API中提供了一套日志打印的方法,java程序人員在設(shè)計之初已經(jīng)想到了這方面的功能,所以從JDK1.4起提供了日志打印的API,只不過被大多數(shù)人忽略了。這套API在java.util.logging包下,使用該種方式不需要引任何的jar,只要在java環(huán)境下即可使用。

          如上圖,是java提供的日志的一些類。使用方法類似下面的代碼,

          public static Logger logger=Logger.getLogger(Test.class.toString());
          logger.info("hello log");

          注意Logger的路徑是java.util.logging.Logger。

          2.2、log4j

          log4j是apache的一個項目,其中又分為log4j1和log4j2,所謂log4j1指的就是其大版本號為1,不過log41在很早之前就已經(jīng)停止更新了,源碼官網(wǎng):https://github.com/apache/logging-log4j1

          可以看的在2012年已經(jīng)停止更新了,也就是說現(xiàn)在通常來說使用的log4j都是log4j2,更確切的說是log4j,為了準(zhǔn)確期間,這里還是和之前的版本進(jìn)行區(qū)分,使用log4j2的名字,log4j2是在log4j1基礎(chǔ)上的升級,并吸收了logback這個框架的優(yōu)秀之處且修復(fù)了其很多問題,可以說log4j2是一個優(yōu)秀的日志框架,其源碼官網(wǎng):https://github.com/apache/logging-log4j2

          官網(wǎng):https://logging.apache.org/log4j/2.x/index.html

          log4j2的maven依賴如下,引入log4j-api和log4j-core即可,

           <dependency>
              <groupId>org.apache.logging.log4j</groupId>
              <artifactId>log4j-api</artifactId>
              <version>2.17.1</version>
            </dependency>
            <dependency>
              <groupId>org.apache.logging.log4j</groupId>
              <artifactId>log4j-core</artifactId>
              <version>2.17.1</version>
            </dependency>

          這里有個問題要注意,log4j1和log4j2的groupId是不一樣的,log4j1的是org.apache.log4j,log4j2的是org.apache.logging.log4j,帶來的變化就是在使用的過程中要注意引用的類的路徑,從路徑上可以確定是使用的log4j1.x還是log4j2.x,如果是org.apache.log4j開頭的包路徑那么是版本1的,是org.apache.logging.log4j開頭的是版本2的。

          使用方式類似如下,

          private static final Logger logger=LogManager.getLogger();
          logger.info();

          2.3、logback

          logback是一個開源的日志框架,是log4j的作者為了代替log4j而開發(fā)的。logback包含三部分,logback-core、logback-classic、logback-access,logback-core是其他兩個模塊的核心,常用到的是logback-core+logback-classic。logback-access常和jetty和tomcat結(jié)合。

          logback的groupId為ch.qos.logback,其maven依賴如下

          <dependency>
              <groupId>ch.qos.logback</groupId>
              <artifactId>logback-core</artifactId>
              <version>1.2.10</version>
            </dependency>
          <dependency>
              <groupId>ch.qos.logback</groupId>
              <artifactId>logback-classic</artifactId>
              <version>1.2.10</version>
            </dependency>
          <!--平時用不到,可不引入-->
          <dependency>
              <groupId>ch.qos.logback</groupId>
              <artifactId>logback-access</artifactId>
              <version>1.2.10</version>
            </dependency>

          使用方法可參考:https://www.jianshu.com/p/3e3b550920b3

          其官網(wǎng):https://logback.qos.ch/index.html

          2.4、slf4j

          slf4j不能稱之為一個日志框架,因為它僅僅提供了一系列的標(biāo)準(zhǔn),提供一系列接口,但沒有實現(xiàn),采用的是門面模式。

          其依賴為:

          <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-api</artifactId>
              <version>1.7.36</version>
            </dependency>

          上面便是slf4j的核心包。

          注意:如果使用slf4j出現(xiàn)下面的日志

          SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
          SLF4J: Defaulting to no-operation (NOP) logger implementation
          SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

          說明沒有日志實現(xiàn)框架,slf4j自己實現(xiàn)了一個日志框架,可以加上下面的依賴

          <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-simple</artifactId>
              <version>1.7.36</version>
            </dependency>

          slf4j可以和其他具體的日志實現(xiàn)框架進(jìn)行結(jié)合使用,如下

          上圖是一個slf4j和其他日志框架結(jié)合的圖形展示,

          slf4j+logback

          需要slf4j-api、logback-api、logback-classic三個包

          slf4j+JDK日志

          需要slf4j-api、slf4j-jdk14,其中slf4j-jdk14是slf4j和JDK日志結(jié)合的jar。

          slf4j+log4j

          需要slf4j+slf4j-log4j12

          slf4j+JCL

          需要slf4j、common-logging

          其官網(wǎng):https://www.slf4j.org/

          2.5、JCL

          JCL是Jakarta Commons Logging的簡寫,又叫Apache Commons Logging,提供的是一個 Java 的日志接口,同時兼顧輕量級和不依賴于具體的日志實現(xiàn)工具。它提供給中間件/日志工具開發(fā)者一個簡單的日志操作抽象,允許程序開發(fā)人員使用不同的具體日志實現(xiàn)工具。用戶被假定已熟悉某種日志實現(xiàn)工具的更高級別的細(xì)節(jié)。JCL提供的接口,對其它一些日志工具,包括Log4J, Avalon LogKit, and JDK 1.4等,進(jìn)行了簡單的包裝,此接口更接近于Log4J和LogKit的實現(xiàn)。

          其包為common-logging.jar包含了所有的功能,還有其他另外兩個包common-logging-api、common-logging-adapters

          官網(wǎng):https://commons.apache.org/proper/commons-logging/guide.html

          三、總結(jié)

          本文簡單總結(jié)了java中常用的日志,其中slf4j和JCL是日志的接口,又都進(jìn)行了簡單實現(xiàn),既可以自己單獨使用,又可以和其他實現(xiàn)日志框架結(jié)合使用,如,log4j、logback、JDK logging等。

          來源:https://www.cnblogs.com/teach/p/15887258.html

          ogstash 是一個開源的數(shù)據(jù)收集引擎,它具有備實時數(shù)據(jù)傳輸能力。它可以統(tǒng)一過濾來自不同源的數(shù)據(jù),并按照開發(fā)者的制定的規(guī)范輸出到目的地。顧名思義,Logstash 收集數(shù)據(jù)對象就是日志文件。由于日志文件來源多(如:系統(tǒng)日志、服務(wù)器日志、網(wǎng)絡(luò)設(shè)備日志等),且內(nèi)容雜亂,不便于人類進(jìn)行觀察。因此,我們可以使用 Logstash 對日志文件進(jìn)行收集和統(tǒng)一過濾,變成可讀性高的內(nèi)容,方便開發(fā)者或運維人員觀察,從而有效的分析系統(tǒng)/項目運行的性能,做好監(jiān)控和預(yù)警的準(zhǔn)備工作等。

          Logstash 通過管道進(jìn)行運作,管道有兩個必需的元素,輸入和輸出,還有一個可選的元素,過濾器。輸入插件從數(shù)據(jù)源獲取數(shù)據(jù),過濾器插件根據(jù)用戶指定的數(shù)據(jù)格式修改數(shù)據(jù),輸出插件則將數(shù)據(jù)寫入到目的地。在實際工作中Logstash數(shù)據(jù)收集的一個流程大概是:數(shù)據(jù)源→通過input插件(如file、redis、stdin)→output插件→寫到Elasticsearch。

          下面我通過ELK平臺收集下圖所示的日志,舉例說明Logstash是怎么收集一些常用各類日志的。這些日志對zabbix服務(wù)器的正常運行至關(guān)重要,這也是大部分應(yīng)用系統(tǒng)正常運行會包含的一些日志。關(guān)于ELK的搭建可以參考快速搭建ELK日志分析平臺,對zabbix監(jiān)控技術(shù)有興趣的同學(xué)可以參考搭建Zabbix監(jiān)控系統(tǒng)部署詳細(xì)步驟。

          1.file插件收集日志文件

          在zabbix服務(wù)器172.18.20.28上編輯logstash配置文件,并將收集到的zabbix_server.log文件數(shù)據(jù)提交到elasticsearch中:

          #cat logstash-zabbixserver.conf
          input {
           file{
           path=> " /var/log/zabbix/zabbix_server.log" #文件路徑
           type=> "zabbix-server" #類似打個標(biāo)記,自定義 
           start_position=> "beginning" #文件頭部讀取,相反還有end
           }
          }
          output {
           elasticsearch {
           hosts=> ["172.28.29.211:9200"] #輸出到elasticsearch
           index=> "zabbix-%{+YYYY.MM.dd}" #按年月日格式生成索引
           }
          }
          

          運行l(wèi)ogstash:

          /usr/local/logstash-6.2.4/bin/logstash -f logstash-zabbixserver.conf
          

          在elasticsearch上查看數(shù)據(jù):

          2. if判斷收集多個日志

          現(xiàn)在需要在收集另外一個日志文件mariadb.log,我們修改logstash配置文件使用if判斷進(jìn)行收集:

          #cat logstash-zabbixserver.conf
          input {
           file{
           path=> " /var/log/zabbix/zabbix_server.log" 
           type=> "zabbix-server" 
           start_position=> "beginning" 
          	}
          	file{
           path=> " /var/log/mariadb/mariadb.log" 
           type=> "mysql" 
           start_position=> "beginning" 
          	}
          }
          output {
          	if [type]==" zabbix-server " { #根據(jù)type來匹配
          	elasticsearch {
          	hosts=> ["172.28.29.211:9200"]
           index=> " zabbix -%{+YYYY.MM.dd}"
           }
           }
           if [type]==" mysql " {
           elasticsearch {
           hosts=> ["172.28.29.211:9200"]
           index=> " zabbix-mysql -%{+YYYY.MM}" #按年月
           } 
           } 
          }
          

          再次運行l(wèi)ogstash:

          /usr/local/logstash-6.2.4/bin/logstash -f logstash-zabbixserver.conf
          

          在elasticsearch上查看另一個收集的日志數(shù)據(jù):

          3.syslog插件收集系統(tǒng)網(wǎng)絡(luò)日志

          syslog默認(rèn)是通過514端口去發(fā)送日志,可以使用logstash安裝對應(yīng)的syslog插件,監(jiān)聽514端口來收集日志。如果只是監(jiān)聽系統(tǒng)日志可以不用安裝logstash的agent,只需要監(jiān)聽對應(yīng)的514端口,收集系統(tǒng)數(shù)據(jù)即可。logstash在INPUT插件中提供了syslog的模塊,可以用于不安裝本地日志收集agent的設(shè)備(如硬件防火墻等),當(dāng)然支持此類協(xié)議的普通服務(wù)器也適用。

          注意:此INPUT插件會同時監(jiān)聽TCP和UDP端口。

          服務(wù)器rsyslog收集

          創(chuàng)建編輯logstash-syslog配置文件,使用syslog插件:

          #cat logstash-syslog.conf
          input {
          	syslog {
           type=> "system-syslog"
           port=> 514 #默認(rèn)為514端口,可自行修改
           }
          }
          output {
           elasticsearch {
           hosts=> ["172.28.29.211:9200"] #輸出到elasticsearch
           index=> "zabbix-syslog-%{+YYYY.MM}" #名稱按年月保存收集
           }
          }
          

          運行l(wèi)ogstash:

          /usr/local/logstash-6.2.4/bin/logstash -f logstash-syslog.conf
          

          重新開啟一個窗口,查看服務(wù)是否啟動:

          # netstat –ntlp | grep 514
          tcp6 0 0 :::514 :::* LISTEN 21544/java 
          

          修改rsyslog配置文件:

          # vi /etc/rsyslog.conf
          …
          #*.* @@remote-host:514 
          *.* @@172.18.20.28:514 #添加遠(yuǎn)程syslog服務(wù)器IP,這里是本機
          

          重啟rsyslog:

          systemctl restart rsyslog
          

          在elasticsearch上查看收集到的服務(wù)器rsyslog日志:

          網(wǎng)絡(luò)設(shè)備syslog收集

          收集交換機網(wǎng)和防火墻syslog日志,配置如下:

          #cat wl-syslog.conf
          input{
           syslog {
           type=> "wl-syslog"
           port=> 514
           }
          }
          output {
           if [host]=="172.18.20.254"{ #根據(jù)host來匹配生成相應(yīng)的索引
           elasticsearch {
           hosts=> ["172.28.29.211:9200"]
           index=> "jhj-%{+YYYY.MM}"
           }
           }
           if [host]=="172.18.16.254"{
           elasticsearch {
           hosts=> ["172.28.29.211:9200"]
           index=> "fhq-%{+YYYY.MM}"
           }
           }
          }
          

          相應(yīng)的網(wǎng)絡(luò)設(shè)備上開啟并指定syslog服務(wù)器,以Cisco設(shè)備為例:

          logging on
          logging host 172.28.29.211
          

          在elasticsearch上查看收集這兩臺網(wǎng)絡(luò)設(shè)備的日志:

          4.grok插件收集Apache訪問日志

          一般系統(tǒng)或服務(wù)生成的日志都是一大長串。每個字段之間用空格隔開。logstash在獲取日志是整個一串獲取,如果把日志中每個字段代表的意思分割開來在傳給elasticsearch。這樣呈現(xiàn)出來的數(shù)據(jù)更加清晰,而且也能讓kibana更方便的繪制圖形。Grok是Logstash最重要的插件。它的主要作用就是將文本格式的字符串,轉(zhuǎn)換成為具體的結(jié)構(gòu)化的數(shù)據(jù),配合正則表達(dá)式使用。

          grok事先已經(jīng)預(yù)定義好了許多正則表達(dá)式規(guī)則,該規(guī)則文件存放路徑:

          /usr/local/logstash-6.2.4/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-
          core-4.1.2/patterns
          

          grok插件語法說明, 以一個簡單的訪問日志為例:

          55.3.244.1 GET /index.html 15824 0.043
          

          這條日志可切分為5個部分,IP(55.3.244.1)、方法(GET)、請求文件路徑(/index.html)、字節(jié)數(shù)(15824)、訪問時長(0.043) ,如果不做拆分的話Kibana里會將所有內(nèi)容都寫在messages字段里。如果我們想把不同字段做分類的話,就可以用grok來進(jìn)行定義,在默認(rèn)配置文件里其實很多配置都已經(jīng)寫好了,只需要引用下:

          %{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
          

          大寫的單詞是預(yù)定義的正則表達(dá)式,可以在grok-patterns文件看到其具體匹配的內(nèi)容。如果匹配的話,就將該字段名稱重新定義為冒號后面的小寫的單詞。用上面那條訪問日志的客戶端IP來說明,它將在Kibana里被定義為client字段并單獨顯示出來,而不是全部塞在了message里。

          寫到filter中:

          filter {
           grok {
           match=> { "message"=> "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"}
           }
          }
          

          解析后:

          client: 55.3.244.1
          method: GET
          request: /index.html
          bytes: 15824
          duration: 0.043
          

          下面是一條zabbix服務(wù)器Apache日志:

          192.168.33.203 - - [11/Jul/2018:09:37:07 +0800] "POST
          /zabbix/jsrpc.php?output=json-rpc HTTP/1.1" 200 65 "http://192.168.33.29/zabbix/zabbix.php?action=dashboard.view" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:61.0) Gecko/20100101 Firefox/61.0"
          

          創(chuàng)建編輯logstash-apache配置文件,使用filter中的grok插件:

          # cat logstash-apache.conf
          input{
           file{
           path=> "/etc/httpd/logs/access_log"
           type=> "apache"
           start_position=> "beginning"
           }
          }
          filter{
           if[type]=="apache"{
           grok{
           match=> {"message"=> "%{COMBINEDAPACHELOG}"}
           }
           }
          }
          output{
           if[type]=="apache"{
           elasticsearch{
           hosts=> ["172.28.29.211:9200"]
           index=> "zabbix_apache-%{+YYYY.MM}"
           }
           }
          }
          #fileter中的message代表一條一條的日志,%{COMBINEDAPACHELOG}代表解析日志的正則表達(dá)式
          

          運行l(wèi)ogstash:

          /usr/local/logstash-6.2.4/bin/logstash -f logstash-apache.conf
          

          在elasticsearch上查看收集到的Apache日志:

          整合到一個logstash配置文件運行

          我們已成功收集到各項日志,現(xiàn)在我們需要將這些單獨的logstash配置文件整合到一個配置文件中,配置如下:

          #cat logstash-all.conf
          input {
           syslog{
           type=> "system-syslog"
           port=> 514 
           }
           file{
           path=> "/var/log/zabbix/zabbix_server.log" 
           type=> "zabbix-server" 
           start_position=> "beginning" 
           }
           file{
           path=> "/var/log/mariadb/mariadb.log" 
           type=> "mysql" 
           start_position=> "beginning" 
           }
           file{
           path=> "/etc/httpd/logs/access_log"
           type=> "apache"
           start_position=> "beginning"
          }
          }
          filter{
           if[type]=="apache"{
           grok{
           match=> {"message"=> "%{COMBINEDAPACHELOG}"}
           }
           }
          }
          output {
          if [type]=="system-syslog" {
           elasticsearch {
           hosts=> ["172.28.29.211:9200"] 
           index=> "zabbix-syslog-%{+YYYY.MM}" 
           }
           }
          if [type]=="zabbix-server" { 
          elasticsearch {
          hosts=> ["172.28.29.211:9200"]
           index=> "zabbix _server-%{+YYYY.MM}"
           }
           }
           if [type]=="mysql" {
           elasticsearch {
           hosts=> ["172.28.29.211:9200"]
           index=> "zabbix-mysql -%{+YYYY.MM}" 
           } 
           } 
          if[type]=="apache"{
           elasticsearch{
           hosts=> ["172.28.29.211:9200"]
           index=> "zabbix_apache-%{+YYYY.MM}"
           }
           }
          }
          

          至此我們配置完成收集到所有zabbix服務(wù)器上日志的logstash文件,最后在后臺運行l(wèi)ogstash:

          # nohup /usr/local/logstash-6.2.4/bin/logstash -f logstash-all.conf -w 4 &
          

          Kibana上日志展示

          Kibana是為Elasticsearch提供的可視化平臺,負(fù)責(zé)數(shù)據(jù)的美觀展示。Kibana服務(wù)默認(rèn)監(jiān)控在5601端口,瀏覽器訪問http://IP:5601可以打開Kibana的界面。左側(cè)導(dǎo)航欄有很多選項,Discover用于和Elasticsearch交互和展示搜索結(jié)果,Visualize用于報表生成。

          我們新建一個收集zabbix-sever的運行日志。點擊工具欄中的Management --> 選擇index patterns --> 點擊Create Index Pattern按鈕。

          然后選擇一個包含了時間戳的索引字段,可以用來做基于時間的處理。Kibana會讀取索引的映射,然后列出所有包含了時間戳的字段。

          點擊create之后,創(chuàng)建完成。

          在DISCOVER就可以選擇查看并搜索相應(yīng)的日志了。

          同理我們創(chuàng)建其他的日志,可以在discover左邊欄選擇fields更加美觀的展示日志。

          0x00 如何理解埋點

          埋點是數(shù)據(jù)采集的專用術(shù)語,在數(shù)據(jù)驅(qū)動型業(yè)務(wù)中,如營銷策略、產(chǎn)品迭代、業(yè)務(wù)分析、用戶畫像等,都依賴于數(shù)據(jù)提供決策支持,希望通過數(shù)據(jù)來捕捉特定的用戶行為,如按鈕點擊量、閱讀時長等統(tǒng)計信息。因此,數(shù)據(jù)埋點可以簡單理解為:針對特定業(yè)務(wù)場景進(jìn)行數(shù)據(jù)采集和上報的技術(shù)方案。

          數(shù)據(jù)埋點非常看重兩件事,一個是數(shù)據(jù)記錄的準(zhǔn)確性,另一個則是數(shù)據(jù)記錄的完備性。

          先講數(shù)據(jù)的準(zhǔn)確性。數(shù)據(jù)埋點非常強調(diào)規(guī)范和流程,因為參數(shù)的規(guī)范與合法,將直接影響到數(shù)據(jù)分析的準(zhǔn)確性,如果準(zhǔn)確性得不到保障,那么所有基于埋點得出的結(jié)論,都是不可信的。辛辛苦苦做了很久的方案,一旦因為一個疏忽的小問題,導(dǎo)致下游集中投訴,其實非常劃不來。

          道理每個人都懂,但現(xiàn)實情況中,數(shù)據(jù)埋點所面對的客觀環(huán)境,其實非常復(fù)雜,例如:

          • 產(chǎn)品在移動場景下,既有原生的IOS和安卓端,也有H5和小程序端,每種場景的技術(shù)棧不同,出現(xiàn)問題的排查成本很高;
          • 埋點準(zhǔn)確性的驗證,需要人肉參與,不能保證完全正確,且一旦出現(xiàn)問題,只能隨著下次發(fā)版來修復(fù),修復(fù)問題的時間成本很高。

          因此本文有非常長的篇幅來寫流程問題,其實是非常有必要的。

          再講數(shù)據(jù)的完備性。因為埋點主要是面向分析使用,對用戶而言是個額外的功能,因此埋點的業(yè)務(wù)侵入性很強,很容易對用戶體驗造成影響。別的不說,僅僅是流量的消耗,就很容被用戶噴。因此,要提前想清楚,我們要采集哪些東西,因為修改方案的成本,是傷不起的。

          通常情況下,我們需要記錄用戶在使用產(chǎn)品過程中的操作行為,通過4W1H模型可以比較好的保障信息是完備的。4W1H包括:

          • Who(誰);
          • When(在什么時間);
          • Where(在什么位置);
          • What(看到了什么);
          • How(做了哪些操作)。

          規(guī)定好記錄信息的基本方法之后,按照固定的頻率,如每小時、每天,或者是固定的數(shù)量,比如多少條日志,或者是網(wǎng)絡(luò)環(huán)境,比如在Wifi下上傳,我們就可以開心的把埋點數(shù)據(jù)用起來了。

          當(dāng)然,數(shù)據(jù)記錄的時效性也比較重要,但因為埋點數(shù)據(jù)通常量級會比較大,且各個端數(shù)據(jù)回傳的時間不同,因此想做到實時統(tǒng)計,還是需要分場景來展開。在Flink技術(shù)日漸成熟的今天,全鏈路的實時采集與統(tǒng)計,已經(jīng)不是什么難題。

          |0x01 埋點的技術(shù)方案

          在埋點的技術(shù)方案中,首先要重視的,是用戶唯一標(biāo)識的建設(shè)。如果做不到對用戶的唯一識別,那么基礎(chǔ)的UV統(tǒng)計,都將是錯誤的。

          因此,在數(shù)據(jù)埋點方案中,有兩個信息是一定要記錄的,即設(shè)備ID+用戶ID。設(shè)備ID代表用戶使用哪個設(shè)備,如安卓的ANDROID_ID/IMEI,IOS中的IDFA/UDID,瀏覽器的Cookie,小程序的OpenID等。用戶ID,代表用戶在產(chǎn)品中所注冊的賬號,通常是手機號,也可以是郵箱等其他格式。

          當(dāng)這兩個信息能夠獲得時,不論是用戶更換設(shè)備,或者是同一臺設(shè)備不同賬號登錄,我們都能夠根據(jù)這兩個ID,來識別出誰在對設(shè)備做操作。

          其次,我們來看一下Web的數(shù)據(jù)采集技術(shù)。Web端數(shù)據(jù)采集主要通過三種方式實現(xiàn):服務(wù)器日志、URL解析及JS回傳。

          • 服務(wù)器日志:指Web服務(wù)器軟件,例如Httpd、Nginx、Tomcat等自帶的日志,例如Nginx的access.log日志等;
          • URL解析:指訪問服務(wù)器時,將URL信息及攜帶的參數(shù)進(jìn)行解析后,上傳服務(wù)器,例如訪問百度首頁:https://www.baidu.com/s?ie=utf-8&wd=你好,我們可以獲得本次訪問的word為“你好”;
          • JS回傳:指在Web頁面上添加的各類統(tǒng)計插件,通過在頁面嵌入自定義的Javascript代碼來獲取用戶的訪問行為(比如鼠標(biāo)懸停的位置,點擊的頁面組件等),然后通過Ajax請求到后臺記錄日志。

          瀏覽器的日志采集種類又可以分為兩大類:頁面瀏覽日志和頁面交互日志。

          • 頁面瀏覽日志:別名為“展現(xiàn)日志”;指當(dāng)一個頁面被瀏覽器加載時所采集的日志,該類型為最基礎(chǔ)的互聯(lián)網(wǎng)日志,也是PV及UV統(tǒng)計的基礎(chǔ)。
          • 頁面交互日志:別名為“點擊日志”;指當(dāng)頁面加載和渲染完成后,用戶可以在頁面上執(zhí)行的各類操作,以便量化感知用戶的興趣點。

          除此之外,還有一些針對特定場合統(tǒng)計的日志,例如頁面曝光時長日志、用戶在線操作監(jiān)控等,但原理都基于上述兩類日志,只是在統(tǒng)計上有所區(qū)分。

          再次,我們來看下客戶端的數(shù)據(jù)采集。與網(wǎng)頁日志對應(yīng)的,是手機應(yīng)用為基礎(chǔ)的客戶端日志,由于早期手機網(wǎng)絡(luò)通訊能力較差,因而SDK往往采用延遲發(fā)送日志的方式,也就是先將日志統(tǒng)計在本地,然后選擇在Wifi環(huán)境下上傳,因而往往會出現(xiàn)統(tǒng)計數(shù)據(jù)延遲的情況。現(xiàn)如今網(wǎng)絡(luò)環(huán)境好了很多,4G、5G流量充足,尤其是視頻類APP基本上都是一直聯(lián)網(wǎng),因而很多統(tǒng)計能夠做到實時統(tǒng)計。

          客戶端的日志統(tǒng)計主要通過SDK來完成,根據(jù)不同的用戶行為分成不同的事件,“事件”是客戶端日志行為的最小單位,根據(jù)類型的不同,可以分為頁面事件(類比頁面瀏覽)和控件點擊事件(類比頁面交互)。對于頁面事件,不同的SDK有不同的方式,主要區(qū)別為是在頁面創(chuàng)建時發(fā)送日志,還是在頁面瀏覽結(jié)束后發(fā)送日志,區(qū)別在于業(yè)務(wù)統(tǒng)計是否需要采集用戶的頁面停留時長。

          頁面事件的統(tǒng)計主要統(tǒng)計如下三類信息:

          • 設(shè)備及用戶的基本信息,例如IMEI、用戶賬號等;
          • 被訪問頁面的信息,例如商品ID、瀏覽店鋪等;
          • 訪問的路徑信息,例如上一個頁面來源等。

          最后,我們還需要考慮小程序等場景的埋點方案,小程序通常情況下,開發(fā)者會聲明好相應(yīng)的方法,按照需求調(diào)用即可,例如微信提供了API上報和填寫配置兩種方案。

          埋點其實還需要考慮數(shù)據(jù)上傳的方案,批量的數(shù)據(jù)可以通過Flume直接上報,流式的可以寫到Kafka,或者直接使用Flink來處理。這些框架相關(guān)的內(nèi)容不是本文考慮的重點,有興趣的可以自行查閱資料。

          |0x02 埋點的流程規(guī)范

          有了指導(dǎo)思路和技術(shù)方案后,我們就可以著手制定相應(yīng)的數(shù)據(jù)埋點流程規(guī)范了。

          籠統(tǒng)上,流程規(guī)范會分成五個步驟,即需求評審、埋點申請、技術(shù)開發(fā)、埋點驗證、發(fā)布上線。

          第一步,需求評審。

          前文提到過,數(shù)據(jù)埋點的方案一旦確定,返工和排查問題的成本都很高,但數(shù)據(jù)埋點之后的分析工作,又涉及到了PD、BI、算法、數(shù)據(jù)等多個角色。因此非常有必要,將需求內(nèi)容和數(shù)據(jù)口徑統(tǒng)一收口,所有人在一套口徑下,將需求定義出來,隨后業(yè)務(wù)側(cè)再介入,進(jìn)行埋點方案的設(shè)計和開發(fā)。

          以前文提到的4W1H模型為例,常見的記錄內(nèi)容如下:

          • Who:設(shè)備ID、用戶ID、手機號、微信識別碼等;
          • Where:在Web、移動端還是小程序下,如果是移動端,GPS地址在哪,使用的是哪個APP;
          • When:記錄日志的時間戳、日志上報的時間戳;
          • What:操作系統(tǒng)、設(shè)備型號、網(wǎng)絡(luò)環(huán)境、APP版本、當(dāng)前頁面、展示內(nèi)容等信息;
          • How:如果是搜索行為,則記錄關(guān)聯(lián)詞;如果是內(nèi)容點擊,則記錄內(nèi)容ID、內(nèi)容類型、列表位置;如果是交易動作,記錄交易的商品ID、類型、數(shù)量;如果是支付過程,記錄付款的方式與付款金額。

          最后我們統(tǒng)計時,按照上述約定,統(tǒng)計用戶在某個時間和地點中,看到了哪些信息,并完成了怎樣的動作。上下游的相關(guān)人員,在使用這份數(shù)據(jù)時,產(chǎn)生的歧義或者是分歧,會小很多。

          第二步,埋點申請。

          當(dāng)下的熱門應(yīng)用,大多是以超級APP的形式出現(xiàn),比如微信、淘寶、支付寶、抖音,超級APP會承載非常多的業(yè)務(wù),因此技術(shù)方案上會十分統(tǒng)一。

          因此,當(dāng)我們的技術(shù)方案確定后,通常要在相應(yīng)的埋點平臺上,進(jìn)行埋點申請。申請的內(nèi)容包括分配的SPM、SCM碼是什么,涉及到的平臺是哪些,等等。SPM、SCM是什么,有什么用,同樣可以自行查閱。

          第三步,技術(shù)開發(fā)。

          當(dāng)需求確定、申請通過后,我們就可以開始開發(fā)動作了,這里基本上是對研發(fā)同學(xué)進(jìn)行約束。埋點的開發(fā),簡單講,是分成行為埋點和事件埋點兩個大類,每一類根據(jù)端的不同進(jìn)行相應(yīng)的開發(fā)。具體的技術(shù)方案詳見前文01章節(jié)。

          詳細(xì)的設(shè)計規(guī)范,是需要留文檔的,因為代碼不能反應(yīng)業(yè)務(wù)的真實意圖,而不論是事后復(fù)盤與業(yè)務(wù)交接,都需要完整的文檔來闡述設(shè)計思路。

          第四步,埋點驗證。

          埋點的驗證很關(guān)鍵,如果上線后才發(fā)現(xiàn)問題,那么歷史數(shù)據(jù)是無法追溯的。

          驗證有兩種方式,一種是實時的功能驗證,一種是離線的日志驗證。

          實時功能驗證,指功能開發(fā)好后,在灰度環(huán)境上測試相應(yīng)的埋點功能是否正常,比如點擊相應(yīng)的業(yè)務(wù)模塊,日志是否會正確的打印出來。通常而言,我們需要驗證如下三個類型的問題:

          • 記錄正確:APP發(fā)生相應(yīng)的動作,檢查日志是否打印正確,如:打開頁面(行為埋點)、點擊按鈕(事件埋點)時,是否日志會記錄;
          • 位置正確:查看SPM、SCM碼與平臺申請的是否一致;
          • 內(nèi)容正確:設(shè)備ID、用戶ID等必須記錄的內(nèi)容是否正確,行為、事件記錄內(nèi)容是否與頁面實際發(fā)生的一致。

          除去實時驗證,我們也需要把日志寫到測試環(huán)境中,查看數(shù)據(jù)上報的過程是否正確,以及對上報后的數(shù)據(jù)進(jìn)行統(tǒng)計,側(cè)面驗證記錄的準(zhǔn)確性,如統(tǒng)計基本的PV、UV,行為、事件的發(fā)生數(shù)量。

          很多時候,數(shù)據(jù)是需要多方驗證的,存在一定的上下游信息不同步問題,比如對某個默認(rèn)值的定義有歧義,日志統(tǒng)計會有效的發(fā)現(xiàn)這類問題。

          第五步,發(fā)布上線。

          應(yīng)用的發(fā)布上線通常會有不同的周期,例如移動端會有統(tǒng)一的發(fā)版時間,而網(wǎng)頁版只需要根據(jù)自己的節(jié)奏走,因此數(shù)據(jù)開始統(tǒng)計的時間是不同的。最后,應(yīng)用應(yīng)當(dāng)對所有已發(fā)布的埋點數(shù)據(jù),有統(tǒng)一的管理方法。

          大多數(shù)時候,數(shù)據(jù)埋點的技術(shù)方案,只需要設(shè)計一次,但數(shù)據(jù)準(zhǔn)確性的驗證,卻需要隨著產(chǎn)品的生命周期持續(xù)下去,因此僅僅依靠人肉來準(zhǔn)確性驗證是不夠的,我們需要平臺來支持自動化的工作。埋點的準(zhǔn)確性,大體有兩種方法保障:一種是灰度環(huán)境下驗證真實用戶數(shù)據(jù)的準(zhǔn)確性;另一種則是在線上環(huán)境中,驗證全量數(shù)據(jù)的準(zhǔn)確性。因此,發(fā)布上線之后,后續(xù)的管理動作,應(yīng)該是對現(xiàn)有流程的自動化管理,因為團(tuán)隊大了,需要埋點的東西多種多樣,讓平臺自己測試、自動化測試,就是很多測試團(tuán)隊必須走的路。

          |0xFF 行業(yè)現(xiàn)狀

          目前行業(yè)中,已經(jīng)有很多比較成熟的數(shù)據(jù)統(tǒng)計平臺,大家對于數(shù)據(jù)埋點也都有自己的方案。常見的有:GrowingIO、神策數(shù)據(jù)、百度統(tǒng)計、谷歌分析、友盟等。官網(wǎng)都有比較詳細(xì)的介紹,這里不再贅述。

          數(shù)據(jù)埋點只是技能的一種,通過埋點的數(shù)據(jù),如何去做分析,其實也很重要。做過互聯(lián)網(wǎng)的同學(xué),基本都會有自己的寶藏庫,來看看業(yè)界的同行都是如何分析問題的,著名的如艾瑞咨詢的數(shù)據(jù)報告。其實再高大上的報告,歸根結(jié)底,也是通過數(shù)據(jù)+模型來分析得到的結(jié)論。

          最后說說自己做數(shù)據(jù)埋點方案的利弊。一些流量型的業(yè)務(wù)模型,使用第三方是沒有問題的,因為第三方通常提供了很強大、很完備的功能,穩(wěn)定性也有保障,但缺點是,無法做平臺規(guī)則之外的數(shù)據(jù)埋點。但如果業(yè)務(wù)數(shù)據(jù)是非常敏感的,比如金融相關(guān),那么還是建議自己做技術(shù)方案,且現(xiàn)有的數(shù)據(jù)埋點方法,都是基于流量分析平臺來做的,對于一些偏傳統(tǒng)的業(yè)務(wù)場景,其實并不是非常適用。

          最后,數(shù)據(jù)埋點,只是一種技術(shù)或者是工具,想要得出有價值的分析成果,需要有有科學(xué)的分析模型做指導(dǎo),也需要有正確的學(xué)習(xí)路線來堅持。


          主站蜘蛛池模板: 日韩一区二区超清视频| 日韩一区二区a片免费观看| 亚洲国产精品一区二区第一页| 国产精品视频一区二区三区四| 国产精品亚洲一区二区三区在线| 国精品无码一区二区三区在线蜜臀| 国产品无码一区二区三区在线蜜桃 | 亚洲日本中文字幕一区二区三区| 夜夜添无码试看一区二区三区| 亚洲一区二区久久| 国产精品污WWW一区二区三区| 91香蕉福利一区二区三区| 精品一区二区高清在线观看| 亚洲一区二区中文| 无码精品人妻一区二区三区影院| 无码AV中文一区二区三区| 一区二区高清在线观看| 怡红院美国分院一区二区| 国产精品一区二区久久精品| 中文字幕一区在线播放| а天堂中文最新一区二区三区| 日韩免费一区二区三区在线播放| 日韩一区二区电影| 久久精品国产一区二区三区不卡 | 国产自产对白一区| 日本免费一区二区三区四区五六区 | 精品福利一区二区三区免费视频 | 精品人妻一区二区三区四区在线 | 人妻AV中文字幕一区二区三区| 亚洲男人的天堂一区二区| 国产精品一区二区久久精品| 人妻无码一区二区三区AV| 91一区二区三区四区五区| 无码人妻精品一区二区三区久久| 高清一区二区三区免费视频| 久久免费国产精品一区二区| 久久久久人妻一区精品色| 中文字幕在线一区二区在线| 成人精品视频一区二区| 日韩免费视频一区| 中文字幕无码一区二区免费|