Squid 記錄檔-store.log

From:http://home.arcor.de/mailerstar/jeff/squid/chap13.html
store.log記錄Squid關於存儲或刪除cache目標的決定。對每個存在cache裡的目標、每個不可cache的目標、以及每個被輪換策略刪除的目標,Squid都會創建相應的日誌條目。該日誌文件內容既包含了內存cache又包含了磁盤cache。

store.log提供了下述不能從access.log獲取的內容:

  1. 某個特定的響應是否被cache。
  2. cache目標的文件號。對UFS基礎的存儲機制,你可轉換該文件號到路徑名,並且檢查cache文件的內容。
  3. 響應的內容長度:包括Content-Length值和實際的body大小。
  4. Date, Last-Modified, 和Expires頭部的值。
  5. 響應的cache關鍵字(例如MD5 hash值)。

默認的store.log格式包含了13個域。如下是日誌樣本:

1256719718.526 RELEASE -1 FFFFFFFF 9C8C8C3D958A2BE32264557DBA81003E  503 1256719718         0        -1 text/html 1784/1784 GET http://192.168.51.34/favicon.ico

每個日誌條目包含如下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條目。然而請注意,目標的cache關鍵字可能改變。當Squid在access.log裡記錄TCP_REFRESH_MISS請求時,這點會發生。情況類似如下:

1065837334.045 SWAPOUT ... 554BACBD2CB2A0C38FF9BF4B2239A9E5 ... http://blah
1066031047.925 RELEASE ... 92AE17121926106EB12FA8054064CABA ... http://blah
1066031048.074 SWAPOUT ... 554BACBD2CB2A0C38FF9BF4B2239A9E5 ... http://blah

發生了什麼呢?該目標原本cache在某個關鍵字下(554B...)。一段時間後,Squid接受到對該目標的另一請求,並轉發確認請求到原始服務器。當響應以新內容返回時,Squid改變舊目標的cache關鍵字(92AE...),以便它能授予新目標正確的關鍵字(554B...)。然後舊目標刪除,新目標存儲到磁盤。
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在相應域放置一個疑問號。
轉換文件號到路徑名
假如想要檢查某個特定的cache文件,你可稍費工夫將文件號轉換到路徑名。另外目錄號和L1和L2值也是必需的。在squid的源代碼裡,storeUfsDirFullPath( )函數做這個事情。可在src/fs/ufs/store_dir_ufs.c文件裡找到它。如下短小的perl腳本模擬了當前算法:

#!/usr/bin/perl
$L1 = 16;
$L2 = 256;
while (<>) {
    $filn = hex($_);
    printf("%02X/%02X/%08X\n",
        (($filn / $L2) / $L2) % $L1,
        ($filn / $L2) % $L2,
        $filn);
}

使用方式:

% echo 000DCD06 | ./fileno-to-pathname.pl
0D/CD/000DCD06

要在第N個cache_dir裡找到該文件,簡單的進入到相應的目錄,並列出或查看該文件:

% cd /cache2
% ls -l 0D/CD/000DCD06
-rw-------  1 squid  squid  391 Jun  3 12:40 0D/CD/000DCD06
% less 0D/CD/000DCD06
Please follow and like us:

發表迴響

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