Squid 記錄檔-access.log

From:http://home.arcor.de/mailerstar/jeff/squid/chap13.html
Squid把關於HTTP事務的關鍵信息存放在access.log裡。該文件是基於行的,也就是說每行對應一個客戶端請求。squid記錄客戶端IP(或主機名)、請求URL、響應size、和其他信息。

Squid 在access.log裡記錄所有HTTP訪問,除了那些在還沒有發送數據前就斷開的連接。Squid也記錄所有的ICP(非HTCP)事務,除非你使用 log_icp_queries指令關閉了這個功能。第13.2.4節描述了其他影響access日誌的squid.conf指令。
默認的access.log格式包含了10個域。如下是日誌樣本:

1256646754.936     28 192.168.51.37 TCP_MISS/200 8561 GET http://js.microsoft.com/library/mnp/2/wt/js/wt.js - DIRECT/203.69.113.11 application/x-javascript
1256646755.266    187 192.168.51.37 TCP_MISS/200 7348 GET http://www.microsoft.com/genuine/static/js/s_code.js - DIRECT/65.55.12.249 application/x-javascript
1256646755.545    186 192.168.51.37 TCP_MISS/200 1709 GET http://www.microsoft.com/genuine/static/js/GFF.js - DIRECT/65.55.12.249 application/x-javascript

如下是對每個域的詳細解釋:
1.時間戳
請求完成時間,以Unix紀元(UTC 1970-01-01 00:00:00)以來的秒數表示,它是毫秒級的。squid使用這種格式而不是人工可讀的時間格式,是為了簡化某些日誌處理程序的工作。
可以使用一個簡單的perl命令來轉化Unix時間戳到本地時間,例如:

perl -pe 's/^\d+\.\d+/localtime($&)/e;' access.log

另外,上述是預設的 log 設定,也可以直接在 squid.conf 裡面更改 log 的格式:

  • 更改為 combined:
  • logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
    access_log /usr/local/squid/logs/access.log combined
    那 aceess log 就會變成這樣:
    192.168.51.30 - - [27/Oct/2009:13:10:54 +0000] "POST http://api.connect.facebook.com/session_state.php HTTP/1.0" 200 779 "http://static.ak.connect.facebook.com/swf/XdComm.swf" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1)" TCP_MISS:DIRECT
  • 不過我比較喜歡改成這樣:
  • logformat denniswave [%{%Y/%m/%d %H:%M:%S}tl] %>a %Ss:%Sh "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %ui %un
    access_log /usr/local/squid/logs/access.log denniswave
    那 aceess log 就會變成這樣:
    [2009/10/27 13:24:40] 192.168.51.37 TCP_MISS:DIRECT "GET http://ad.yieldmanager.com/st? HTTP/1.1" 200 6128 "http://tw.mc729.mail.yahoo.com/mc/md.php?en=BIG5-HKSCS" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" - -

2.響應時間
對HTTP事務來說,該域表明squid花了多少時間來處理請求。在squid接受到HTTP請求時開始計時,在響應完全送出後計時終止。響應時間是毫秒級的。
對ICP查詢來說,響應時間通常是0。這是因為squid回答ICP查詢非常迅速。甚至,squid在接受到ICP查詢和發送完響應之間,不會更新進程時鐘。
儘管時間值是毫秒級的,但是精度可能是10毫秒。在squid負載繁重時,計時變得沒那麼精確。
3.客戶端地址
該域包含客戶端的IP地址,或者是主機名--假如激活了log_fqdn。出於安全或隱私的理由,你可能需要使用client_netmask指令來掩蓋客戶端地址的一部分。然而,這樣讓來自同一客戶端的組請求變得不可能。
4.結果/狀態碼
該域包含2個token,以斜槓分隔。第一個token叫結果碼,它把協議和事務結果(例如TCP_HIT或UDP_DENIED)進行歸類。這些是 squid專有的編碼,在13.2.1節裡有定義。以TCP_開頭的編碼指HTTP請求,以UDP_開頭的編碼指ICP查詢。
第2個token是HTTP響應狀態碼(例如200,304,404等)。狀態碼通常來自原始服務器。在某些情形下,squid可能有義務自己選擇狀態碼。這些編碼在HTTP的RFC裡定義,在後面會有概述。
5.傳輸size
該域指明傳給客戶端的字節數。嚴格的講,它是squid告訴TCP/IP協議棧去發送給客戶端的字節數。這就是說,它不包括TCP/IP頭部的 overhead。也請注意,傳輸size正常來說大於響應的Content-Length。傳輸size包括了HTTP響應頭部,然而Content- Length不包括。
傳輸size可用於近似的帶寬使用分析,但並非精確的HTTP實體size計算。假如需要瞭解響應的Content-Length,可在store.log裡找到它。
6.請求方式
該域包含請求方式。因為squid客戶端可能使用ICP或HTTP,請求方式就可能是HTTP-或ICP-這2種。最普通的HTTP請求方式是GET。ICP查詢總以ICP_QUERY的形式被記載。請見6.1.2.8節關於squid瞭解的HTTP方式列表。
7.URI
該域包含來自客戶端請求的URI。大多數記錄下來的URI實際是URL(例如,它們有主機名)。
Squid對某些失敗使用特殊的記錄格式。例如Squid不能解析HTTP請求,或者不能決定URI,這時你可能見到類似於"error:invalid-request." 的字串出現在URI的位置。例如:

1066036250.603 310 192.0.34.70 NONE/400 1203 GET error:invalid-request - NONE/- -

另外在該域裡,也請留心URI裡的空格字符。取決於uri_whitespace設置,squid可能在日誌文件裡打印URI時帶空格字符。若發生這種情況,則閱讀access.log文件的日誌分析工具可能會遇到麻煩。
在記日誌時,squid刪掉了在第一個問號(?)之後的所有URI字符,除非禁用了strip_query_terms指令。
8.客戶端身份
Squid有2種不同的辦法來決定用戶的身份。一種是RFC 1413身份協議,另一種來自HTTP驗證頭部。
Squid 試圖基於ident_lookup_access規則進行身份查詢,假如有的話。另外,假如使用代理驗證(或在代理人模式下的規範服務驗證),squid 會在該域放置給定的用戶名。假如2者都提供給squid一個用戶名,並且你使用了原始access.log格式,那麼HTTP驗證名字會記錄下來,RFC 1413名字會忽略掉。普通日誌文件格式會把兩者都獨立的記錄。
9.對端編碼/對端主機
對端信息包含了2個token,以斜槓分隔。它僅僅與cache丟失的請求有關。第一個token指示如何選擇下一跳,第二個token是下一跳的地址。對端編碼列在13.2.3節裡。
當 squid發送一個請求到鄰居cache時,對端主機地址是鄰居的主機名。假如請求是直接送到原始服務器的,則squid會寫成原始服務器的IP地址或主 機名--假如禁用了log_ip_on_direct。NONE/-這個值指明squid不轉發該請求到任何其他服務器。
10.內容類型
原始access.log的默認的最後一個域,是HTTP響應的內容類型。squid從響應的Content-Type頭部獲取內容類型值。假如該頭部丟失了,squid使用一個橫槓(-)代替。
假如激活了log_mime_headers指令,squid在每行追加2個附加的域:
11.HTTP請求頭部
Squid 編碼HTTP請求頭部,並且在一對方括號之間打印它們。方括號是必須的,因為squid不編碼空格字符。編碼方案稍許奇怪。回車(ASCII 13)和換行(ASCII 10)分別打印成\r和\n。其他不可打印的字符以RFC 1738風格來編碼,例如Tab(ASCII 9)變成了%09。
12.HTTP響應頭部
Squid編碼HTTP響應頭部,並且在一對方括號之間打印它們。注意這些是發往客戶端的頭部,可能不同於從原始服務器接受到的頭部。
Squid 只有在整個響應發送到客戶端完成以後,才寫access.log日誌。這點允許squid在日誌文件裡包含請求和響應兩者信息。然而,需要花費數分鐘甚至 數小時才能完成的事務,請求期間的日誌在access.log裡不可見。當這類型的事務呈現出性能或策略問題時,access.log可能對你沒有幫助。 代替的,可使用cache管理器來瀏覽掛起事務的列表(見14章)。
結果/狀態碼的分類
相應於HTTP請求,下列標籤可能出現在access.log文件的第四個域。

TCP_HIT Squid發現請求資源的貌似新鮮的拷貝,並將其立即發送到客戶端。
TCP_MISS Squid沒有請求資源的cache拷貝。
TCP_REFERSH_HIT Squid發現請求資源的貌似陳舊的拷貝,並發送確認請求到原始服務器。原始服務器返回304(未修改)響應,指示squid的拷貝仍舊是新鮮的。
TCP_REF_FAIL_HIT Squid發現請求資源的貌似陳舊的拷貝,並發送確認請求到原始服務器。然而,原始服務器響應失敗,或者返回的響應Squid不能理解。在此情形下,squid發送現有cache拷貝(很可能是陳舊的)到客戶端。
TCP_REFRESH_MISS Squid發現請求資源的貌似陳舊的拷貝,並發送確認請求到原始服務器。原始服務器響應新的內容,指示這個cache拷貝確實是陳舊的。
TCP_CLIENT_REFRESH_MISS Squid發現了請求資源的拷貝,但客戶端的請求包含了Cache-Control: no-cache指令。Squid轉發客戶端的請求到原始服務器,強迫cache確認。
TCP_IMS_HIT 客戶端發送確認請求,Squid發現更近來的、貌似新鮮的請求資源的拷貝。Squid發送更新的內容到客戶端,而不聯繫原始服務器。
TCP_SWAPFAIL_MISS Squid發現請求資源的有效拷貝,但從磁盤裝載它失敗。這時squid發送請求到原始服務器,就如同這是個cache丟失一樣。
TCP_NEGATIVE_HIT 在對原始服務器的請求導致HTTP錯誤時,Squid也會cache這個響應。在短時間內對這些資源的重複請求,導致了否命中。 negative_ttl指令控制這些錯誤被cache的時間數量。請注意這些錯誤只在內存cache,不會寫往磁盤。下列HTTP狀態碼可能導致否定 cache(也遵循於其他約束): 204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504。
TCP_MEM_HIT Squid在內存cache裡發現請求資源的有效拷貝,並將其立即發送到客戶端。注意這點並非精確的呈現了所有從內存服務的響應。例如,某些cache在內存裡,但要求確認的響應,會以TCP_REFRESH_HIT, TCP_REFRESH_MISS等形式記錄。
TCP_DENIED 因為http_access或http_reply_access規則,客戶端的請求被拒絕了。注意被http_access拒絕的請求在第9域的值是NONE/-,然而被http_reply_access拒絕的請求,在相應地方有一個有效值。
TCP_OFFLINE_HIT 當offline_mode激活時,Squid對任何cache響應返回cache命中,而不用考慮它的新鮮程度。
TCP_REDIRECT 重定向程序告訴Squid產生一個HTTP重定向到新的URI(見11.1節)。正常的,Squid不會記錄這些重定向。假如要這樣做,必須在編譯squid前,手工定義LOG_TCP_REDIRECTS預處理指令。
NONE 無分類的結果用於特定錯誤,例如無效主機名。
UDP_HIT Squid在cache裡發現請求資源的貌似新鮮的拷貝。
UDP_MISS Squid沒有在cache裡發現請求資源的貌似新鮮的拷貝。假如同一目標通過HTTP請求,就可能是個cache丟失。請對比UDP_MISS_NOFETCH。
UDP_MISS_NOFETCH 跟UDP_MISS類似,不同的是這裡也指示了Squid不願去處理相應的HTTP請求。假如使用了-Y命令行選項,Squid在啟動並編譯其內存索引時,會返回這個標籤而不是UDP_MISS。
UDP_DENIED 因為icp_access規則,ICP查詢被拒絕。假如超過95%的到某客戶端的ICP響應是UDP_DENIED,並且客戶端數據庫激活了(見附錄A),Squid在1小時內,停止發送任何ICP響應到該客戶端。若這點發生,你也可在cache.log裡見到一個警告。
UDP_INVALID Squid接受到無效查詢(例如截斷的消息、無效協議版本、URI裡的空格等)。Squid發送UDP_INVALID響應到客戶端。
Please follow and like us:

0 comments on “Squid 記錄檔-access.log

2 Pings/Trackbacks 於 "Squid 記錄檔-access.log"

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *