
日志是數(shù)據(jù),數(shù)據(jù)卻不一定是日志。日志主要用于記錄發(fā)生過的事件,寫入和查詢是常用操作,不推薦對其進(jìn)行修改操作,日志過量或者過期的時候,需要清理。
日志是應(yīng)用不可分割的一部分,沒有日志的應(yīng)用是殘缺的。依賴日志,我們可以追溯故障、找出BUG、統(tǒng)計數(shù)據(jù)和分析用戶行為。適當(dāng)?shù)娜罩究梢蕴峁椭?,日志太少和太多都會造成不良影響?/p>
本文討論了Web應(yīng)用的HTTP日志、應(yīng)用日志和用戶日志。
HTTP日志
正規(guī)部署的Web應(yīng)用,都會使用類似Nginx, Apache這樣的Web服務(wù)器來做反向代理以及負(fù)載均衡。這樣一來,就由這一層服務(wù)來搜集HTTP日志。即便是開發(fā)模式下,使用開發(fā)Web服務(wù)器,也會產(chǎn)生HTTP日志。一般的HTTP日志,至少會包含這些字段:日志產(chǎn)生時間、HTTP method、url path、HTTP協(xié)議版本、響應(yīng)狀態(tài)碼、響應(yīng)字節(jié)大小、訪問者ip、代理服務(wù)器ip、請求處理耗時、Referrer、User Agent。
-
根據(jù)訪問者ip、代理服務(wù)器ip分析用戶身份
我們知道,訪問Web服務(wù)的過程中,用戶發(fā)起的請求,可能會經(jīng)過層層轉(zhuǎn)發(fā)之后,才能抵達(dá)最終的Web內(nèi)容提供者的服務(wù)器。每次請求轉(zhuǎn)發(fā),實際上是代理服務(wù)器發(fā)起一個新的請求,對接的服務(wù)器識別到的訪問者ip就會變成代理服務(wù)器的ip,為了解決這個問題,代理服務(wù)器會將原始請求客戶端的ip也保存起來,一并添加到轉(zhuǎn)發(fā)的請求中。這樣一來,最終內(nèi)容提供者的服務(wù)器就會識別到兩個ip,一個是訪問者ip,另一個是代理服務(wù)器ip。
互聯(lián)網(wǎng)上,部分訪問者不愿意提供自身的真實信息(這類人包含隱私保護(hù)用戶和黑客等),就會使用代理服務(wù)器掩蓋自身的真實ip,或者是偽造虛假的ip,我們可以從訪問日志中初窺端倪。
日志中只有訪問者ip,沒有代理服務(wù)器ip,可以判斷:該訪問者的訪問不經(jīng)過代理服務(wù)器,或者該訪問者是一個高匿名的代理服務(wù)器;日志中的訪問者ip和代理服務(wù)器ip相同,可以判斷:該訪問者使用了匿名代理服務(wù)器;日志中的訪問者ip和代理服務(wù)器ip不同,可以判斷:該訪問者使用了透明代理服務(wù)器,或者該訪問者使用了欺騙性代理服務(wù)器。
-
根據(jù)訪問者ip短時間的出現(xiàn)次數(shù),判斷是否受到攻擊
每個網(wǎng)站,根據(jù)其流行程度,可以制定出一份不同時間間隔、正常訪問量閾值的報表。對比這份報表,和我們監(jiān)控的每個ip在單位時間范圍內(nèi)的訪問量,我們可以分析出該ip是否正在進(jìn)行違規(guī)訪問操作。
例如,某個ip在一分鐘之內(nèi)訪問網(wǎng)站1000次,而其他ip只有每分鐘幾十次,正常閾值是100,那么這個ip就可以劃入重點(diǎn)監(jiān)控范圍,繼續(xù)分析其訪問的url path,訪問的方法類型等,判斷它是否正在違規(guī)操作,一旦確認(rèn),就可以進(jìn)行封禁ip的操作。
-
根據(jù)User Agent分析客戶端類型
Web請求中,一般會包含一個字段用來描述發(fā)起請求的客戶端版本類型信息,例如
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36,有的Web服務(wù)器為了提高兼容性,會根據(jù)客戶端的版本情況,返回不同的響應(yīng),以提高用戶體驗。當(dāng)然,還可以根據(jù)客戶端類型,統(tǒng)計分析網(wǎng)站訪問者的客戶端環(huán)境分布情況。各大搜索引擎,都有自己的爬蟲機(jī)器人。這些爬蟲機(jī)器人,會根據(jù)網(wǎng)站的開放情況,來爬取其網(wǎng)頁信息,大多數(shù)開放的網(wǎng)站,都十分歡迎搜索引擎的爬蟲機(jī)器人,借此提高其搜索排名。
數(shù)據(jù)分析公司,會到感興趣的網(wǎng)站上爬取內(nèi)容,分析數(shù)據(jù),生成行業(yè)報表。這種對網(wǎng)站內(nèi)容提供者沒什么好處的訪問,就不那么受歡迎了,特別是數(shù)據(jù)分析公司的爬蟲,不是那么規(guī)范的情況下。網(wǎng)站內(nèi)容提供者限制非瀏覽器和搜索引擎爬蟲之后,數(shù)據(jù)分析公司的爬蟲,一般就會偽裝成二者,進(jìn)行內(nèi)容爬取。爬蟲攻防戰(zhàn),值得大書特書了,這里就不細(xì)說。
-
根據(jù)響應(yīng)狀態(tài)碼,判斷請求和響應(yīng)的狀態(tài)
HTTP響應(yīng)狀態(tài)碼,大致分為四類:成功響應(yīng)200299,重定向響應(yīng)300399,客戶端請求錯誤400~499, 服務(wù)器響應(yīng)錯誤500~599。
短時間大量出現(xiàn)重定向響應(yīng),可以判斷為網(wǎng)站的鏈接可能有反復(fù)循環(huán)的情況,可以根據(jù)url情況加以排查。
短時間大量出現(xiàn)客戶端請求錯誤,可以判斷為:1、網(wǎng)站提供了錯誤的url path,2、爬蟲機(jī)器人正在暴力掃描網(wǎng)站,3、網(wǎng)站攻擊者正在攻擊網(wǎng)站。具體情況再根據(jù)真實響應(yīng)碼和url判斷。
短時間大量出現(xiàn)服務(wù)器響應(yīng)錯誤,可以判斷為:1、Web應(yīng)用代碼出現(xiàn)BUG(響應(yīng)碼500),2、Web應(yīng)用進(jìn)程出現(xiàn)問題(響應(yīng)碼502),3、Web應(yīng)用出現(xiàn)性能瓶頸(響應(yīng)碼504)
-
根據(jù)url path數(shù)量分布,分析網(wǎng)站熱點(diǎn)
- 統(tǒng)計url path的分布,對熱點(diǎn)url path進(jìn)行排名,可以得知網(wǎng)站的熱點(diǎn)在哪里,從而進(jìn)行熱點(diǎn)分流,性能優(yōu)化,也可以為運(yùn)營團(tuán)隊提供數(shù)據(jù)支撐。
-
根據(jù)響應(yīng)字節(jié)大小和請求處理耗時,分析響應(yīng)緩慢的原因
已知某個url path的頁面訪問非常慢,根據(jù)HTTP日志進(jìn)行分析時,可以查看其響應(yīng)字節(jié)大小和請求處理耗時。
響應(yīng)字節(jié)很小,比如少于1M,請求處理耗時也很少,比如少于100ms,那么:1、有可能是客戶端的帶寬很少,或者網(wǎng)絡(luò)故障導(dǎo)致的。2、有可能該url path頁面需要加載其他資源,并依賴于其他資源來顯示頁面,而訪問其他資源緩慢導(dǎo)致該url path的頁面緩慢。
響應(yīng)字節(jié)較大,比如超過10M,請求處理耗時很少,比如不超過1s,那么原因很簡單,代理服務(wù)器到客戶端的網(wǎng)絡(luò)帶寬限制導(dǎo)致的。
響應(yīng)字節(jié)很小,比如少于1M,請求處理耗時很大,比如超過5s,那么原因很簡單,Web應(yīng)用在處理該url path請求的時候,因為性能、網(wǎng)絡(luò)、算法或數(shù)據(jù)處理量過大的原因?qū)е碌摹?/p>
響應(yīng)字節(jié)較大,比如超過10M,請求處理耗時也很大,比如超過5s,那么原因很簡單,就是文件過大導(dǎo)致下載緩慢。
-
根據(jù)Referrer設(shè)置防盜鏈,統(tǒng)計流量來源
我們在云平臺上存儲了圖片,提供自己的網(wǎng)站使用,云平臺按照資源訪問量收費(fèi)。這時候,其他網(wǎng)站盜用了我們的圖片鏈接,我們就會為其他網(wǎng)站的流量付費(fèi),這時候,就需要用到防盜鏈。當(dāng)然,我們自己網(wǎng)站的資源,不想提供給其他網(wǎng)站使用時,也可以設(shè)置防盜鏈。
請求中帶的Referrer鍵,其值是跳轉(zhuǎn)到當(dāng)前請求的上一個請求的完整url,我們在網(wǎng)頁中嵌入了圖片,加載圖片時Referrer就會帶上該網(wǎng)頁的url,百度上搜索一個關(guān)鍵字出來的網(wǎng)頁,上面有廣告鏈接,點(diǎn)擊之后,訪問該廣告的網(wǎng)頁,也會在Referrer中帶上百度的url。
通過Web應(yīng)用中,根據(jù)請求的Referrer,是否在白名單之內(nèi),來決定是否返回正確的內(nèi)容,就是防盜鏈技術(shù)的核心思想了。如果沒有提供Referrer,那就是直接訪問了,網(wǎng)站也可以自行決定是否提供內(nèi)容。當(dāng)然,其他網(wǎng)站也可以使用偽裝和匿名技術(shù)來突破防盜鏈的防御,所以,防盜鏈技術(shù),防君子不防小人。
廣告網(wǎng)頁通過Referrer統(tǒng)計流量來源,從而為對方付費(fèi),這就是廣告來源統(tǒng)計和計費(fèi)的核心。當(dāng)然,也可以通過url上添加參數(shù)的情況來進(jìn)行來源統(tǒng)計,例如我們常用的邀請碼機(jī)制,url類似
http://www.example.com/register?code=xxxxxx,其中的code=xxxxxx,就是給網(wǎng)站說明了,訪問網(wǎng)頁的來源。
應(yīng)用日志
應(yīng)用日志是Web應(yīng)用直接產(chǎn)生的。應(yīng)用日志可以接入到操作系統(tǒng)的日志系統(tǒng)中,例如syslog,也可以自行輸出到標(biāo)準(zhǔn)輸出中。Web應(yīng)用產(chǎn)生的異常錯誤,會輸出到標(biāo)準(zhǔn)錯誤輸出中。由于Web應(yīng)用在生產(chǎn)環(huán)境都是以daemon方式運(yùn)行(后臺運(yùn)行),所以負(fù)責(zé)監(jiān)控和管理Web應(yīng)用進(jìn)程的守護(hù)進(jìn)程(例如supervisor),就要搜集這些應(yīng)用日志,以便查詢和分析。
分析應(yīng)用日志時,一般需要結(jié)合日志上下文進(jìn)行分析,因為一旦拋出異常錯誤,日志一般不是一行就能記錄完的。異常日志一般會以代碼調(diào)用追溯的方式來展現(xiàn)。例如:
RuntimeError Traceback (most recent call last)
<ipython-input-5-e3097d5bf3e6> in <module>()
----> 1 test1()
<ipython-input-2-ee75a0b1ab43> in test1()
1 def test1():
2 print('test1 start')
----> 3 test2()
4 print('test1 end')
5
<ipython-input-4-a2967c4ec095> in test2()
1 def test2():
2 print('test2 start')
----> 3 raise RuntimeError('runtime error')
4 print('test2 end')
5
RuntimeError: runtime error
根據(jù)錯誤提示可以知道,在運(yùn)行test1這個無參數(shù)的函數(shù)時,發(fā)生的異常,追溯到test1定義內(nèi)部的第三行,調(diào)用test2這個無參數(shù)的函數(shù)時,再次追溯到test2定義內(nèi)部的第三行,源頭上,正是這里發(fā)生了異常,去掉這一行,修復(fù)異常,再次運(yùn)行函數(shù)test1時,就能成功了。
用戶日志
用戶日志的產(chǎn)生,需要在Web應(yīng)用代碼中實現(xiàn),常規(guī)做法,是將用戶日志存儲到數(shù)據(jù)庫中,如果將用戶日志存入到文件中,則可以歸納到應(yīng)用日志中了,當(dāng)然,這是一種不嚴(yán)謹(jǐn)?shù)膭澐帧?/p>
我們知道,HTTP是無狀態(tài)的協(xié)議,開發(fā)者利用cookie技術(shù)識別不同用戶,這樣一來,我們就可以區(qū)分相同客戶端ip和相同電腦下的不同用戶。有了更加細(xì)致的用戶日志,我們可以做更加精細(xì)的統(tǒng)計分析。
-
行為審計
- 用戶日志可以記錄用戶在網(wǎng)站的所有行為,包括不限于瀏覽頁面、修改資料、發(fā)送消息、付款等等,甚至可以細(xì)化到點(diǎn)擊了哪些按鈕。通過分析這些行為,購物網(wǎng)站可以分析出用戶大致喜歡什么類型商品,內(nèi)部網(wǎng)站可以審計用戶的操作是否符合規(guī)范等等。
-
熱點(diǎn)分析
- 根據(jù)用戶日志將用戶進(jìn)行分類,就可以分析網(wǎng)站更受什么樣的人群的喜愛。通過用戶喜愛商品的排名統(tǒng)計,可以分析出網(wǎng)站的最受歡迎的商品。根據(jù)商品銷量排名,可以分析出網(wǎng)站的暢銷商品。
數(shù)據(jù)分析師可以根據(jù)這些用戶日志,挖掘出更多的價值和隱藏的信息。
總結(jié)
本文詳細(xì)討論了HTTP日志的分析使用,并對應(yīng)用日志和用戶日志的常規(guī)使用做出了說明,通過閱讀本文,可以對Web應(yīng)用下的日志和其使用案例有了初步的了解,更多的詳情,可以參考更加詳細(xì)的資料。
無戒365訓(xùn)練營 第八篇