前面的話
幾乎所有的服務器和代理都會記錄下它們所處理的HTTP事務摘要。這么做出於一系列的原因:跟蹤使用情況、安全性、計費、錯誤檢測等等。本文將介紹日志記錄
記錄內容
大多數情況下,日志的記錄出於兩種原因:査找服務器或代理中存在的問題(比如,哪些請求失敗了),或者是生成Web站點訪問方式的統計信息。統計數據對市場營銷、計費和容量規划(比如,決定是否需要增加服務器或帶寬)都非常有用
可以把一個HTTP事務中所有的首部都記錄下來,但對每天要處理數百萬個事務的服務器和代理來說,這些數據的體積超大,很快就會失控。不應該記錄實際上並不感興趣,甚至從來都不會去看一眼的數據
通常,只記錄事務的基本信息就行了。通常會記錄下來的幾個字段示例為:HTTP方法;客戶端和服務器的HTTP版本;所請求資源的URL;響應的HTTP狀態碼;請求和響應報文的尺寸(包含所有的實體主體部分);事務開始時的時間戳;Referer首部和User-Agent首部的值
HTTP方法和URL說明了請求試圖做些什么——比如,GET某個資源或POST某個訂單。可以用URL來記錄Web站點上頁面的受歡迎程度
版本字符串給出了與客戶端和服務器有關的一些提示,在客戶端和服務器之間出現一些比較奇怪或非預期的交互動作時,它會非常有用。比如,如果請求的失敗率高於預期,那版本信息指向的可能是一個無法與服務器進行交互的新版瀏覽器
HTTP狀態碼說明了請求的執行狀況:是否成功執行,認證請求是否失敗,資源是否找到等
請求/響應的大小和時間戳主要用於記賬——記錄流入、流出或流經應用程序的字節有多少。還可用時間戳將觀察到的問題與當時發起的一些請求關聯起來
日志格式
大部分商用和開源的HTTP應用程序都支持以一種或多種常用格式進行日志記錄。很多這樣的應用程序都支持管理者配置日志格式,創建自定義的格式
應用程序支持管理者使用這些更標准的格式的主要好處之一在於,可以充分利用那些已構建好的工具處理這些日志,並產生基本的統計信息。有很多開源包和商用包都可用來壓縮日志,以進行匯報。使用標准格式,應用程序及其管理員就都可以利用這些包了
【常見日志格式】
現在,最常見的日志格式之一就是常用日志格式。這種日志格式最初由NCSA定義,很多服務器在默認情況下都會使用這種日志格式。可以將大部分商用及開源服務器配置為使用這種格式,有很多商用及免費工具都可輔助解析常用日志格式的文件。下表按序列出了常用日志格式中的字段
下面列出了幾個常見日志格式條目
在這些例子中,字段的分配如下所示
[注意]remotehost字段可以是http-guide.com那樣的主機名,也可以是209.1.32.44這樣的IP地址
第二個(usemame)和第三個(auth-username)字段之間的破折號說明字段為空。這說明要么是沒有進行ident査找(第二個字段為空),要么是沒有進行認證(第三 個字段為空)
【組合日志格式】
另一種常用日志格式為組合日志格式(Combined Log Format),例如Apache服務器就支持這種格式。組合日志格式與常用日志格式很類似。實際上,它就是常用日志格式的精確鏡像,只是添加了兩個字段。User-Agent字段用於說明是哪個HTTP客戶端應用程序在發起已被記錄的請求,而Referer字段則提供了更多與請求端在何處找到這個URL的有關信息
下面列出了新加的組合日志格式字段
字段 描述
Referer Referer首部的內容
User-Agent User-Agent首部的內容
下例給出了一個組合日志格式的條目
Referer字段和User-Agent字段的值如下所示
上面的組合日志格式條目示例中的前七個字段和常用日志格式中的完全一樣。兩個新字段Referer和User-Agent附加在日志條目的末尾
【網景擴展日志格式】
網景進入商用HTTP應用程序領域時,為其服務器定義了很多其他HTTP應用程序開發者已接納的日志格式。網景的格式是基於NCSA的常用日志格式的,但它們擴展了該格式,以支持與代理和Web緩存這樣的HTTP應用程序相關的字段
網景擴展日志格式的前7個字段與常用日志格式中的那些字段完全相同。下表按序列出了網景擴展日志格式引入的新字段
下面給出了一個網景擴展日志格式的條目
209.1.32.44 - - [03/Oct/2016:14:16:00-0400] "GET / HTTP/1.0" 200 1024 200 1024 0 0 215 260 279 254 3
在這個例子中,擴展字段的值如下所示
上面的網景擴展日志格式條目示例中的前7個字段是常用日志格式條目示例的鏡像
另一種網景日志格式,網景擴展2日志格式采用了擴展日志格式,並添加了一些與HTTP代理和Web緩存應用程序有關的附加信息。這些附加字段有助於更好地描繪HTTP客戶端和HTTP代理應用程序間的交互圖景
網景擴展2日志格式是基於網景擴展日志格式的,初始字段與網景擴展日志的字段完全相同
下表按序列出了網景擴展2日志格式新加的字段
下例給出了一個網景擴展2日志格式的條目
209.1.32.44 - - [03/Oct/2016:14:16:00-0400] "GET / HTTP/1.0" 200 1024 200 1024 0 0 215 260 279 254 3 DIRECT FIN WRITTEN
這個例子中拓展字段的值如下所示
上面的網景擴展2日志格式條目中的前16個字段就是網景擴展日志格式示例條目的鏡像
下表列出了有效的網景路由代碼
下表列出了有效的網景完成狀態碼
下表列出了有效的網景緩存代碼
與很多其他HTTP應用程序一樣,網景應用程序也有其他的日志格式,包括一種靈活日志格式和一種管理者輸出自定義日志字段的方式。這些格式給予管理者更大的控制權,並可以選擇在日志中報告HTTP事務處理的哪些部分(首部、狀態、尺寸等),以自定義其日志
由於很難預測管理者希望從其日志中獲取哪些信息,才添加了管理者配置自定義格式的能力。很多其他的代理和服務器都有發布自定義日志的能力
【Squid代理日志格式】
Squid代理緩存(http://www.squid-cache.org)是Web上一個很古老的部分。其起源可以回溯到一個早期的Web代理緩存項目(ftp://ftp.cs.colorado.edu/pub/techreports/schwartz/Harvest.Conf.ps.Z)。Squid是開源社團多年來擴展增強的一個開源項目。有很多工具可以用來輔助管理Squid應用程序,包括一些有助於處理、審核及開發其日志的工具。很多后繼代理緩存都為自己的日志使用了Squid格式,這樣才能更好地利用這些工具
Squid日志條目的格式相當簡單。下表總結了該日志格式的字段
下面給出了一個Squid日志格式條目的例子
這些字段的值如下所示
下表列出了各種Squid結果代碼
命中率測量
原始服務器通常會出於計費的目的保留詳細的日志記錄。內容提供者需要知道URL的受訪頻率,廣告商需要知道廣告的出現頻率,網站作者需要知道所編寫的內容的受歡迎程度。客戶端直接訪問Web服務器時,日志記錄可以很好地跟蹤這些信息
但是,緩存服務器位於客戶端和服務器之間,用於防止服務器同時處理大量訪問請求(這正是緩存的目的)。緩存要處理很多HTTP請求,並在不訪問原始服務器的情況下滿足它們的請求,服務器中沒有客戶端訪問其內容的記錄,導致日志文件中出現遺漏
由於日志數據會遺失,所以,內容提供者會對其最重要的頁面進行緩存清除(cache bust)。緩存清除是指內容提供者有意將某些內容設置為無法緩存,這樣,所有對此內容的請求都會被導向原始服務器。於是,原始服務器就可以記錄下訪問情況了。不使用緩存可能會生成更好的日志,但會減緩原始服務器和網絡的請求速度,並增加其負荷
由於代理緩存(及一些客戶端)都會保留自己的日志,所以如果服務器能夠訪問這些日志(或者至少有一種粗略的方式可以判斷代理緩存會以怎樣的頻率提供其內容),就可以避免使用緩存清除。命中率測量協議是對HTTP的一種擴展,它為這個問題提供了一種解決方案。命中率測量協議要求緩存周期性地向原始服務器匯報緩存訪問的統計數據
命中率測量協議定義了一種HTTP擴展,它提供了一些基本的功能,緩存和服務器可以實現這些功能來共享訪問信息,規范已緩存資源的可使用次數
緩存給日志訪問帶來了問題,命中率測量並不是這個問題的完整解決方案,但它確實提供了一種基本方式,以獲取服務器希望跟蹤的度量值。命中率測量協議並沒有(而且可能永遠都不會)得到廣泛的實現或應用。也就是說,在維護緩存性能增益的同時,像命中率測量這樣的合作方案會給出一些提供精確訪問統計信息的承諾。希望這會推動命中率測量協議的實現,而不是把內容標記為不可緩存的
【Meter 首部】
命中率測量擴展建議使用新增加的首部Meter,緩存和服務器可以通過它在相互間傳輸與用法和報告有關的指令,這與用來進行緩存指令交換的Cache-Control首部很類似
下表列出了定義的各種指令和誰可以在Meter首部傳輸這些指令
下圖給出了一個執行中的命中串測量實例。事務的第一部分就是客戶端和代理緩存之間一個普通的HTTP事務,但在代理請求中,要注意有插入的Meter首部和來自服務器的響應。這里,代理正在通知服務器它可以進行命中率測量。作為回應,服務器則請求代理報告它的命中次數
從客戶端的角度來看,請求正常結束了,代理開始代表服務器跟蹤該請求資源的命中次數。稍后,代理會嘗試與服務器再次驗證資源。代理會在發送給服務器的條件請求中嵌入它跟蹤記錄的計量信息
隱私
日志記錄實際上就是服務器和代理執行的一項管理功能,所以整個操作對用戶來說都是透明的。通常,用戶甚至都不清楚他們的HTTP事務已被記錄
Web應用程序的開發者和管理者要清楚跟蹤用戶的HTTP事務可能帶來的影響。他可以根據獲取的信息收集很多有關用戶的情況。很顯然,這些信息可以用於不良目的——歧視、騷擾、勒索等。進行日志記錄的Web服務器和代理一定要注意保護其終端用戶的隱私
有些情況下,比如在工作環境中,跟蹤某用戶的使用情況以確保他沒有偷懶是可行的,但管理員也應該將監視大家事務處理的事情公之於眾
簡單來說,日志記錄對管理者和開發者來說都是很有用的工具。只是要清楚在沒有獲得用戶許可,或在其不知情的情況下,使用記錄其行為的日志可能會存在侵犯隱私的問題