Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产亚洲精品久久综合影院,亚洲乱码一区,91手机在线视频观看

          整合營(yíng)銷(xiāo)服務(wù)商

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

          免費(fèi)咨詢熱線:

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

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

          、背景

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

          二、詳情

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

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

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

          2.1、java自帶的日志

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

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

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

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

          2.2、log4j

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

          可以看的在2012年已經(jīng)停止更新了,也就是說(shuō)現(xiàn)在通常來(lái)說(shuō)使用的log4j都是log4j2,更確切的說(shuō)是log4j,為了準(zhǔn)確期間,這里還是和之前的版本進(jìn)行區(qū)分,使用log4j2的名字,log4j2是在log4j1基礎(chǔ)上的升級(jí),并吸收了logback這個(gè)框架的優(yōu)秀之處且修復(fù)了其很多問(wèn)題,可以說(shuō)log4j2是一個(gè)優(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>

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

          使用方式類(lèi)似如下,

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

          2.3、logback

          logback是一個(gè)開(kāi)源的日志框架,是log4j的作者為了代替log4j而開(kāi)發(fā)的。logback包含三部分,logback-core、logback-classic、logback-access,logback-core是其他兩個(gè)模塊的核心,常用到的是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>
          <!--平時(shí)用不到,可不引入-->
          <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不能稱(chēng)之為一個(gè)日志框架,因?yàn)樗鼉H僅提供了一系列的標(biāo)準(zhǔn),提供一系列接口,但沒(méi)有實(shí)現(xiàn),采用的是門(mé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.

          說(shuō)明沒(méi)有日志實(shí)現(xiàn)框架,slf4j自己實(shí)現(xiàn)了一個(gè)日志框架,可以加上下面的依賴

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

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

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

          slf4j+logback

          需要slf4j-api、logback-api、logback-classic三個(gè)包

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

          其包為common-logging.jar包含了所有的功能,還有其他另外兩個(gè)包c(diǎn)ommon-logging-api、common-logging-adapters

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

          三、總結(jié)

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

          來(lái)源:https://www.cnblogs.com/teach/p/15887258.html

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

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

          下面我通過(guò)ELK平臺(tái)收集下圖所示的日志,舉例說(shuō)明Logstash是怎么收集一些常用各類(lèi)日志的。這些日志對(duì)zabbix服務(wù)器的正常運(yùn)行至關(guān)重要,這也是大部分應(yīng)用系統(tǒng)正常運(yùn)行會(huì)包含的一些日志。關(guān)于ELK的搭建可以參考快速搭建ELK日志分析平臺(tái),對(duì)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" #類(lèi)似打個(gè)標(biāo)記,自定義 
           start_position=> "beginning" #文件頭部讀取,相反還有end
           }
          }
          output {
           elasticsearch {
           hosts=> ["172.28.29.211:9200"] #輸出到elasticsearch
           index=> "zabbix-%{+YYYY.MM.dd}" #按年月日格式生成索引
           }
          }
          

          運(yùn)行l(wèi)ogstash:

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

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

          2. if判斷收集多個(gè)日志

          現(xiàn)在需要在收集另外一個(gè)日志文件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來(lái)匹配
          	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}" #按年月
           } 
           } 
          }
          

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

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

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

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

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

          注意:此INPUT插件會(huì)同時(shí)監(jiān)聽(tīng)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}" #名稱(chēng)按年月保存收集
           }
          }
          

          運(yùn)行l(wèi)ogstash:

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

          重新開(kāi)啟一個(gè)窗口,查看服務(wù)是否啟動(dòng):

          # 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,這里是本機(jī)
          

          重啟rsyslog:

          systemctl restart rsyslog
          

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

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

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

          #cat wl-syslog.conf
          input{
           syslog {
           type=> "wl-syslog"
           port=> 514
           }
          }
          output {
           if [host]=="172.18.20.254"{ #根據(jù)host來(lái)匹配生成相應(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è)備上開(kāi)啟并指定syslog服務(wù)器,以Cisco設(shè)備為例:

          logging on
          logging host 172.28.29.211
          

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

          4.grok插件收集Apache訪問(wèn)日志

          一般系統(tǒng)或服務(wù)生成的日志都是一大長(zhǎng)串。每個(gè)字段之間用空格隔開(kāi)。logstash在獲取日志是整個(gè)一串獲取,如果把日志中每個(gè)字段代表的意思分割開(kāi)來(lái)在傳給elasticsearch。這樣呈現(xiàn)出來(lái)的數(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插件語(yǔ)法說(shuō)明, 以一個(gè)簡(jiǎn)單的訪問(wèn)日志為例:

          55.3.244.1 GET /index.html 15824 0.043
          

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

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

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

          寫(xiě)到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á)式
          

          運(yùn)行l(wèi)ogstash:

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

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

          整合到一個(gè)logstash配置文件運(yùn)行

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

          #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文件,最后在后臺(tái)運(yùn)行l(wèi)ogstash:

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

          Kibana上日志展示

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

          我們新建一個(gè)收集zabbix-sever的運(yùn)行日志。點(diǎn)擊工具欄中的Management --> 選擇index patterns --> 點(diǎn)擊Create Index Pattern按鈕。

          然后選擇一個(gè)包含了時(shí)間戳的索引字段,可以用來(lái)做基于時(shí)間的處理。Kibana會(huì)讀取索引的映射,然后列出所有包含了時(shí)間戳的字段。

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

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

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

          0x00 如何理解埋點(diǎn)

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

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

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

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

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

          因此本文有非常長(zhǎng)的篇幅來(lái)寫(xiě)流程問(wèn)題,其實(shí)是非常有必要的。

          再講數(shù)據(jù)的完備性。因?yàn)槁顸c(diǎn)主要是面向分析使用,對(duì)用戶而言是個(gè)額外的功能,因此埋點(diǎn)的業(yè)務(wù)侵入性很強(qiáng),很容易對(duì)用戶體驗(yàn)造成影響。別的不說(shuō),僅僅是流量的消耗,就很容被用戶噴。因此,要提前想清楚,我們要采集哪些東西,因?yàn)樾薷姆桨傅某杀荆莻黄鸬摹?/span>

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

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

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

          當(dāng)然,數(shù)據(jù)記錄的時(shí)效性也比較重要,但因?yàn)槁顸c(diǎn)數(shù)據(jù)通常量級(jí)會(huì)比較大,且各個(gè)端數(shù)據(jù)回傳的時(shí)間不同,因此想做到實(shí)時(shí)統(tǒng)計(jì),還是需要分場(chǎng)景來(lái)展開(kāi)。在Flink技術(shù)日漸成熟的今天,全鏈路的實(shí)時(shí)采集與統(tǒng)計(jì),已經(jīng)不是什么難題。

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

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

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

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

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

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

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

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

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

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

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

          頁(yè)面事件的統(tǒng)計(jì)主要統(tǒng)計(jì)如下三類(lèi)信息:

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

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

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

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

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

          籠統(tǒng)上,流程規(guī)范會(huì)分成五個(gè)步驟,即需求評(píng)審、埋點(diǎn)申請(qǐng)、技術(shù)開(kāi)發(fā)、埋點(diǎn)驗(yàn)證、發(fā)布上線。

          第一步,需求評(píng)審。

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

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

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

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

          第二步,埋點(diǎn)申請(qǐng)。

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

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

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

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

          詳細(xì)的設(shè)計(jì)規(guī)范,是需要留文檔的,因?yàn)榇a不能反應(yīng)業(yè)務(wù)的真實(shí)意圖,而不論是事后復(fù)盤(pán)與業(yè)務(wù)交接,都需要完整的文檔來(lái)闡述設(shè)計(jì)思路。

          第四步,埋點(diǎn)驗(yàn)證。

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

          驗(yàn)證有兩種方式,一種是實(shí)時(shí)的功能驗(yàn)證,一種是離線的日志驗(yàn)證。

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

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

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

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

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

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

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

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

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

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

          最后說(shuō)說(shuō)自己做數(shù)據(jù)埋點(diǎn)方案的利弊。一些流量型的業(yè)務(wù)模型,使用第三方是沒(méi)有問(wèn)題的,因?yàn)榈谌酵ǔL峁┝撕軓?qiáng)大、很完備的功能,穩(wěn)定性也有保障,但缺點(diǎn)是,無(wú)法做平臺(tái)規(guī)則之外的數(shù)據(jù)埋點(diǎn)。但如果業(yè)務(wù)數(shù)據(jù)是非常敏感的,比如金融相關(guān),那么還是建議自己做技術(shù)方案,且現(xiàn)有的數(shù)據(jù)埋點(diǎn)方法,都是基于流量分析平臺(tái)來(lái)做的,對(duì)于一些偏傳統(tǒng)的業(yè)務(wù)場(chǎng)景,其實(shí)并不是非常適用。

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


          主站蜘蛛池模板: 免费无码VA一区二区三区| 欧美av色香蕉一区二区蜜桃小说| 国产视频一区在线观看| 少妇激情AV一区二区三区| 色婷婷综合久久久久中文一区二区| 无码日韩精品一区二区免费暖暖| 一区二区在线观看视频| 亚洲综合色一区二区三区| 亚洲福利视频一区二区| 久久久久人妻一区二区三区vr| 亚洲国产欧美一区二区三区| 国产精品毛片一区二区| 日韩亚洲AV无码一区二区不卡| 欧美日本精品一区二区三区| 丰满人妻一区二区三区视频| 亚洲电影一区二区三区| 天天视频一区二区三区| 日韩精品人妻一区二区中文八零| 亚洲高清美女一区二区三区| 精品国产一区二区三区久久影院 | 午夜影视日本亚洲欧洲精品一区| 亚洲一区电影在线观看| 精品国产亚洲第一区二区三区| 国产在线视频一区| 亚洲.国产.欧美一区二区三区 | 亚洲视频一区在线播放| 无码人妻aⅴ一区二区三区| 久久久久人妻一区精品果冻| 成人区精品一区二区不卡亚洲 | 国产精品va无码一区二区| 无码人妻一区二区三区兔费| 一区二区乱子伦在线播放| 国产精品无码一区二区三区毛片| 国产一区二区免费视频| 国产精品一区二区久久乐下载| 亚洲日本一区二区三区| 日本精品一区二区久久久| 无码国产精品一区二区免费式影视| 国产精品一区三区| 欧洲亚洲综合一区二区三区| 制服丝袜一区在线|