Squid 日志詳解


原文地址: http://www.php-oa.com/2008/01/17/squid-log-access-store.html

access.log 日志

在squid中access訪問日志最為重要,位於/var/log/squid/access.log,Squid把關於HTTP響應的關鍵信息存放在access.log里。該文件是基於行的,也就是說每行對應一個客戶端請求。 squid記錄客戶端IP(或主機名)、請求URL、響應size、和其他信息。 
常用的記錄格式如下(包含了10個域):

例如:

1
2
1206507660.803  84367 192.168.1.114 TCP_MISS/502 1486 GET
http://123.138.238.114/QQ2008SpringKB1.exe - DIRECT/123.138.238.114 text/html

下面來看看意思

1
logformat squid %ts . %03tu %6tr %>a %Ss / %03Hs %<st %rm %ru %un %Sh /%<A %mt
  1. 時間戳: 請求完成時間,以 Unix 時間來記錄的(UTC 1970-01-01 00:00:00 開始的時間)它是毫秒級的。 squid使用這種格式而不是人工可讀的時間格式,是為了簡化某些日志處理程序的工作。
  2. 響應時間: 對HTTP響應來說,該域表明squid花了多少時間來處理請求。在squid接受到HTTP請求時開始計時,在響應完全送出后計時終止。響應時間是毫秒級的。盡管時間值是毫秒級的,但是精度可能是10毫秒。在squid負載繁重時,計時變得沒那么精確。
  3. 客戶端地址: 該域包含客戶端的IP地址,或者是主機名.
  4. 結果/狀態碼: 該域包含2個 token,以斜杠分隔。第一個token叫結果碼,它把協議和響應結果(例如TCP_HIT或UDP_DENIED)進行歸類。這些是squid專有的編碼,以TCP_開頭的編碼指HTTP請求,以UDP_開頭的編碼指ICP查詢。第2個token是HTTP響應狀態碼(例如200,304,404等)。狀態碼通常來自原始服務器。在某些情形下,squid可能有義務自己選擇狀態碼.
  5. 傳輸size: 該域指明傳給客戶端的字節數。嚴格的講,它是squid告訴TCP/IP協議棧去發送給客戶端的字節數。這就是說,它不包括TCP/IP頭部的overhead。也請注意,傳輸size正常來說大於響應的Content-Length。傳輸size包括了HTTP響應頭部,然而Content- Length不包括。
  6. 請求方式: 該域包含請求方式.
  7. URI: 該域包含來自客戶端請求的URI。大多數記錄下來的URI實際是URL(例如,它們有主機名)。在記日志時,squid刪掉了在第一個問號(?)之后的所有URI字符,除非禁用了strip_query_terms指令。
  8. 客戶端身份: 無
  9. 對端編碼/對端主機: 對端信息包含了2個token,以斜杠分隔。它僅僅與cache 不命中的請求有關。第一個token指示如何選擇下一跳,第二個token是下一跳的地址。當squid發送一個請求到鄰居cache時,對端主機地址是鄰居的主機名。假如請求是直接送到原始服務器的,則squid會寫成原始服務器的IP地址或主機名–假如禁用了log_ip_on_direct。 NONE/-這個值指明squid不轉發該請求到任何其他服務器。
  10. 內容類型: 原始access.log的默認的最后一個域,是HTTP響應的內容類型。 squid從響應的Content-Type頭部獲取內容類型值。假如該頭部丟失了,squid使用一個橫杠(-)代替。

假如激活了 log_mime_hdrs 指令,squid在每行追加2個附加的域:

  • HTTP請求頭部: Squid 編碼HTTP請求頭部,並且在一對方括號之​​間打印它們。方括號是必須的,因為squid不編碼空格字符。編碼方案稍許奇怪。回車(ASCII 13)和換行(ASCII 10)分別打印成\r和\n。其他不可打印的字符以RFC 1738風格來編碼,例如Tab(ASCII 9)變成了%09。
  • HTTP響應頭部: Squid編碼HTTP響應頭部,並且在一對方括號之​​間打印它們。注意這些是發往客戶端的頭部,可能不同於從原始服務器接受到的頭部。

如果日志需要給 awstats 分析和讓人可讀性更加好,可能需要修改日志為 combined:

logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
access_log /var/log/squid/access.log combined

會顯示為

1
110.211.14.58 - - [04/Apr/2008:00:07:39 +0800] "GET http://www.php-oa.com/0.flv HTTP/1.1" 206 139732 "-" "Mozilla/4.0 (compatible; MSIE 6.0;)" TCP_HIT  13936

 

 

store.log

在 store.log 記錄上面不能從 access.log 中的一些信息,如 Squid 關於存儲或刪除 cache 目標的相關的一些操作和時間.對每個 Squid 中存儲的文件和不能 cache 的文件,以及每個被輪換策略刪除的文件,Squid 都會創建相應的日志.
注意這個日志文件記錄了所有的文件.
信息有如下的一些信息:

  •     某個特定的 HTTP 請求是否被 cache.
  •     cache 目標的文件號.可以通過應用的 UFS 存儲機制,來查到該文件號到路徑名,並且檢查 cache 文件的內容.
  •     響應的內容長度: 包括 Content-Length 值和實際的 body 大小.
  •     Date, Last-Modified, 和 Expires 等過期頭部的值.
  •     響應的 cache 關鍵字(例如MD5 hash值).

例如:

1
1323468268.676 RELEASE -1 FFFFFFFF 3D7E036366ECC176665F3ED635E9B058  200 1323467369 1322847727 1365003369 video/x-flv 521858017/96195 GET http: //www.php-oa.com/0.flv

如上:每個日志條目包含如下13個域:

  1. 時間戳: 事件何時發生,表現為Unix紀元以來的秒數,它是毫秒級的.
  2. 動作: cache目標發生的動作.該域有3個可能值:SWAPOUT,RELEASE,和SO_FAIL. 

     

    • SWAPOUT在Squid成功的存儲目標到磁盤時發生.某些目標例如那些消極cache的,僅保存在內存而不是磁盤,Squid不會在store.log裡記錄它們.
    • SO_FAIL表明Squid不能完整的存儲目標到磁盤.多半意味着存儲機制拒絕以寫方式打開新的磁盤文件.
    • RELEASE在Squid從cache裡刪除目標,或首先就決定響應不可存儲時發生.
  3. 目錄號: 目錄號是十進制小數形式,它是個到cache目錄的7位索引.對沒有存儲到磁盤的目標,該域包含-1值.
  4. 文件號: 文件號是25位的標識符,內在的被squid使用.它被寫成8字符的十六進制號.對UFS基礎的存儲機制沒有存儲到磁盤的目標,沒有有效的文件號.對這些目標,該域的值是FFFFFFFF.僅僅在RELEASE和SO_FAIL情況下才會出現這個值.
  5. cache關鍵字: Squid使用MD5哈希值作為主要的索引來定位目標.該關鍵字基於請求方式、URI、和其他可能的信息計算得來.可以從cache關鍵字來查找store.log條目.
  6. 狀態碼: 該域顯示響應的HTTP狀態碼,跟access.log一樣.表13.1是狀態碼列表.
  7. 日期: HTTP響應的Date頭部值,表現為Unix紀元以來的秒數.值-1表示Date頭部不可解析,-2意味着頭部完缺.
  8. 最后修改時間: HTTP響應的Last-Modified頭部值,表現為Unix紀元以來的秒數.值-1表示Last-Modified頭部不可解析,-2意味着頭部完缺.
  9. 過期時間: HTTP響應的Expires頭部值,表現為Unix紀元以來的秒數.值-1表示Expires頭部不可解析,-2意味着頭部完缺.
  10. 內容類型: HTTP響應的Content-Type頭部值,排除了任何media-type參數.假如Content-Type丟失了,Squid插入值unknown.
  11. 內容長度/大小: 該域包含2個數字,以斜杠分開.第一個是Content-Length頭部值. -1表明Content-Length頭部不存在.第二個是HTTP消息 body的實際大小.你可使用這2個數字來部分的驗證接受到的響應,並驗證原始服務器是否不正確的計算了內容長度.大多數情形下,這2個數字相等.
  12. 方式: 請求目標的HTTP方式,跟access.log里的一樣.
  13. URI: 最后一個域是請求URI,跟access.log里的一樣.該域也有前述章節提到的空格問題.然而,這里不必為此擔憂,因為你可安全的忽略任何多余的域.


對許多RELEASE的條目,在最后8個域出現的是疑問號(?).這是因為這些域的大部分值來自squid稱為MemObject的結構.該結構僅在目標已被接受時,或目標被完整存儲在內存時,才會出現. Squid cache里的大部分目標沒有MemObject結構,因為它們僅存在於磁盤.對這些情況,Squid在相應域放置一個疑問號.
 

簡單分析

squid的日志很重要.常常要了解的,其中最重要的就是命中率啦,不然反向代理做的用就不大.

#cat access.log|gawk '{print $4}'|sort|uniq -c|sort -nr

9568 TCP_IMS_HIT/304
6313 TCP_HIT/200
2133 TCP_MISS/200
1568 TCP_MISS/206
587 TCP_MEM_HIT/200
531 TCP_MISS/304
207 TCP_REFRESH_HIT/200
152 TCP_REFRESH_HIT/304
86 TCP_NEGATIVE_HIT/404
69 TCP_MISS/404
9 TCP_MISS/000
4 TCP_MISS/503
1 TCP_REFRESH_MISS/000
1 TCP_DENIED/400

可以使用上面的方法,大約的分析一下命令中比.什么意思就看下面的詳解.

#cat /var/log/squid/access.log |grep TCP_MEM_HIT

如果看到很多的TCP_MEM_HIT ,這表明該文件是從內存緩存讀取的,squid已經起作用了!你再用瀏覽器打開該文件,應該是快如閃電了..呵呵,大功告成了!還有其他類型的HIT,如TCP_HIT等等,這些是從磁盤讀取的,我覺得加速的意義不大,只不過緩解了apache的壓力而已.

相應於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

無分類的結果用於特定錯誤,例如無效主機名.

相應於ICP查詢,下列標簽可能出現在access.log文件的第四域.

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響應到客戶端.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM