squid日志4

来源:百度文库 编辑:神马文学网 时间:2024/04/26 19:54:33

13.3.1 转换文件号到路径名


假如想要检查某个特定的cache文件,你可稍费工夫将文件号转换到路径名。另外目录号和L1和L2值

也是必需的。在squid的源代码里,storeUfsDirFullPath( )函数做这个事情。可在

src/fs/ufs/store_dir_ufs.c文件里找到它。如下短小的perl脚本模拟了当前算法:


useragent_log /usr/local/squid/var/logs/useragent.log7


这样使用它:


% 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





13.4 referer.log

可选的referer.log包含了来自客户端请求的Referer头部。为了使用该功能,必须在./configure时打

开--enable-referer-log选项。还必须用referer_log指令来指定一个路径。例如:


referer_log /usr/local/squid/var/logs/referer.log


假如想禁止referer.log,则可设置文件名为none。


Referer头部正常情况下包含一个URI,从这个URI获取到了请求(见RFC2616的14.36节)。例如,

当web浏览器发布请求到某个内嵌图片时,Referer头部被设置成包含该图片的HTML网页的URI。当

你点击HTML超链接时,它也被设置。某些web站点管理员使用Referer值来查找死链接。在使用

Squid作为代理人模式时,你也许发现referer.log特别有用。


referer.log格式简单,仅有4个域。如下是一些示例:


1068047502.377 3.0.168.206            http://www.amazon.com/exec/obidos/search-handle-form/002-7230223-8205634            http://www.amazon.com/exec/obidos/ASIN/0596001622/qid=1068047396/sr=2-1/...            1068047503.109 3.0.168.206            http://www.amazon.com/exec/obidos/ASIN/0596001622/qid=1068047396/sr=2-1/...            http://g-images.amazon.com/./images/G/01/gourmet/gourmet-segway.gif            1068047503.196 3.0.168.206            http://www.amazon.com/exec/obidos/ASIN/0596001622/qid=1068047396/sr=2-1/...            http://g-images.amazon.com/./images/G/01/marketing/cross-shop/arnold/appar...            1068047503.198 3.0.168.206            http://www.amazon.com/exec/obidos/ASIN/0596001622/qid=1068047396/sr=2-1/...            http://g-images.amazon.com/./images/G/01/marketing/cross-shop/arnold/appar...            1068047503.825 3.0.168.206            http://www.amazon.com/exec/obidos/ASIN/0596001622/qid=1068047396/sr=2-1/...            http://images.amazon.com/./images/P/B00005R8BC.01.TZZZZZZZ.jpg            1068047503.842 3.0.168.206            http://www.amazon.com/exec/obidos/ASIN/0596001622/qid=1068047396/sr=2-1/...            http://images.amazon.com/./images/P/0596001622.01._PE_PI_SCMZZZZZZZ_.jpg


注意缺少Referer头部的请求不会被记录。这4个域描述如下:



           
       
  • 1. 时间戳


       

       
  • 请求时间,表现为Unix纪元以来的秒数,是毫秒级的。
       


注意的是,不像access.log,referer.log在Squid接受到完整请求时,会立刻记录。这样,

referer.log条目在access.log之前发生,后者等待响应完成才记录。



           
       
  • 2. 客户端地址


       

       
  • 客户端地址跟access.log里的一样。log_fqdn和client_netmask指令也影响该日志文件。


       

       
  • 3. referer


       

       
  • 来自客户端请求的Referer头部值。注意referer值可能有空格字符或其他字符,在写
  • referer.log前Squid不会对其进行编码。


       

       
  • 4. URI


       

       
  • 客户端正请求的URI。它匹配access.log里的URI。
       





13.5 useragent.log

可选的useragent.log包含来自客户端请求的User-Agent头部值。为了使用该功能,必须在运行

./configure时打开--enable-useragent-log选项。还必须使用useragent_log指令来提供一个路径

名。例如:


___FCKpd___5


User-Agent头部正常情况下包含了发起请求的user-agent的描述。大多数情形下,该描述只是简单

的产品名列表和版本信息。你应该清楚应用程序可以轻易的提供伪造的user-agent信息。现代

user-agent提供途径可定制该描述。甚至Squid在转发请求里能改变这个User-Agent头部。


useragent.log格式相对简单,看起来如下:


3.0.168.206 [05/Nov/2003:08:51:43 -0700]            "Mozilla/5.0 (compatible; Konqueror/3; FreeBSD)"            3.0.168.207 [05/Nov/2003:08:52:18 -0700]            "Opera/7.21 (X11; FreeBSD i386; U)  [en]"            4.241.144.204 [05/Nov/2003:08:55:11 -0700]            "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/103u (KHTM..."            3.0.168.206 [05/Nov/2003:08:51:43 -0700]            "Java1.3.1_01"            64.68.82.28 [05/Nov/2003:08:52:50 -0700]            "Googlebot/2.1 (http://www.googlebot.com/bot.html)"            3.0.168.205 [05/Nov/2003:08:52:50 -0700]            "WebZIP/4.1 (http://www.spidersoft.com)"            4.241.144.201 [05/Nov/2003:08:52:50 -0700]            "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt; Hotbar 3.0)"            3.0.168.206 [05/Nov/2003:08:54:40 -0700]            "Bookmark Renewal Check Agent [http://www.bookmark.ne.jp/] (Version 2.0..."


不像其他日志文件,它仅有3个域:



           
       
  • 1. 客户端地址


       

       
  • 跟access.log里的一样。log_fqdn和client_netmask指令也影响该日志文件。


       

       
  • 2. 时间戳


       

       
  • 不像其他日志文件那样,用Unix纪元以来的秒数来描述时间,这里使用人工可读的格式。它是
  • HTTP通用日志文件格式的时间戳,看起来如下:
       

       
    [10/Jun/2003:22:38:36 -0600]

            注意方括号界定时间戳,它包含一个空格。也请注意,跟referer.log一样,这些条目在
  • Squid接受到完整请求时,立刻被记录。


       

       
  • 3. user-agent


       

       
  • User-Agent头部的值。这些字串几乎总包含空格。在将其写入日志文件时,Squid不会编码
  • User-Agent值。
       





13.6 swap.state

swap.state文件是目标写入cache目录、或从cache目录删除的日志写照。每个cache_dir有它自己

的swap.state文件。当Squid启动时,它读取swap.state文件来重建cache目标的内存索引。这些

文件对Squid管理来说,至关重要。


默认情况下,每个cache.state文件位于它相应的cache目录。这样,每个state文件自动驻留在每个

cache_dir下。这点很有用--假如你想重新排序cache_dir行,或想从cache_dir列表里删除条目的

话。


如果想将它们放在其他位置,可使用cache_swap_log指令来做:


cache_swap_log /usr/local/squid/var/logs/swap.state


在此情况下,Squid对每个cache目录创建一个swap.state文件,并增加数字后缀。例如,假如有4个

cache目录,Squid创建如下日志:


/usr/local/squid/var/logs/swap.state.00            /usr/local/squid/var/logs/swap.state.01            /usr/local/squid/var/logs/swap.state.02            /usr/local/squid/var/logs/swap.state.03


在这个情形下,如果你要增加、删除、或重排序cache_dir行,就必须手工重命名swap.state文件,

以保持事情一致。


技术上,swap.state格式是独立于存储机制的。然而,在当前版本的Squid里,所有的存储机制使用

同一种格式。swap.state文件使用修正大小(48位)的二进制格式。各个域值以主机字节顺序记录,

这样在不同的操作系统之间不便迁移。表13-3描述了swap.state日志条目的各个域的说明。




Table 13-3. swap.state entry fields


Name Size, in bytes Description op 1 Operation on the entry: added (1) or deleted (2). file number 4 Same as the fourth field of store.log, except it is stored in binary. timestamp 4 A timestamp corresponding to the time when the response was generated or last validated. Taken from the Date header for responses that have one. Stored as the number of seconds since the Unix epoch. lastref 4 A timestamp corresponding to the most recent access to the object. expires 4 The object's expiration time, taken from an Expires header or Cache-Control max-age directive. last-modified 4 The object's Last-Modified value. swap file size 4 The amount of space the object occupies on disk. This includes HTTP headers and other Squid-specific meta-information. refcount 2 The number of times this object has been requested. flags 2 Various internal flags used by Squid. key 16 The MD5 hash of the corresponding URI. Same as the key in store.log, except this one is stored in binary.



13.7 轮转日志

Squid不断的写日志,假如cache非常忙,那么在一段时间后,这些日志文件可能变得很大。某些操作

系统甚至限制了文件的最大size(例如2G),假如写文件超过了这个size就会报错。为了保持日志文件

容易管理,以及让Squid正常工作,必须定期轮转日志。


Squid有内建的功能用于轮转日志。可通过squid -k rotate命令来调用它,然后告诉Squid对每个日志

文件保持多少份旧拷贝。例如,假如设置它为7,对每个日志文件会有8个版本:1个当前的,和7个旧

的。


旧日志文件以数字扩展来重命名。例如,当执行一次轮转时,Squid重命名log.6到log.7,然后是

log.5到log.6,依此类推。当前log变成log.0,并且Squid创建一个新的空文件,命名为log。


每次执行squid -k rotate时,Squid轮转下述文件:cache.log, access.log, store.log,

useragent.log (假如激活), 以及referer.log (假如激活)。Squid也会创建最新版本的swap.state

文件。然而请注意,swap.state不会以数字扩展形式来轮转。


Squid不会自己轮转日志,最好的办法是在crontab里自动执行。例如:


0 0 * * * /usr/local/squid/sbin/squid -k rotate


假如你想编写自己的脚本来管理日志文件,Squid提供了一个有用的模式,简单的设置logfile_rotate

指令为0。这样,当你运行squid -k rotate命令时,Squid简单的关闭当前日志文件,并且打开新的。

如果操作系统允许重命名被其他进程打开的文件,则这点非常有用。下述shell脚本描述了一个思路:


#!/bin/sh            set -e            yesterday_secs=`perl -e 'print time -43200'`            yesterday_date=`date -r $yesterday_secs +%Y%m%d`            cd /usr/local/squid/var/logs            # rename the current log file without interrupting the logging process            mv access.log access.log.$yesterday_date            # tell Squid to close the current logs and open new ones            /usr/local/squid/sbin/squid -k rotate            # give Squid some time to finish writing swap.state files            sleep 60            mv access.log.$yesterday_date /archive/location/            gzip -9 /archive/location/access.log.$yesterday_date





13.8 隐私和安全

Squid的日志文件特别是access.log,包含了用户的活跃记录,因此它受隐私问题支配。作为Squid管

理员,你必须采取额外的小心来保证日志文件安全。最好的办法是限制访问Squid主机的人员的数量。

假如这点行不通,那么就要谨慎的检查文件和目录许可,确保日志文件不会被非信任的、或未授权的用

户访问。


也可利用client_netmask和strip_query_terms指令来保护用户隐私。前者让识别access.log里的用

户困难;后者移除了URI查询条件以避免泄露用户私人信息。更多信息见13.2.4节。


如果想要保持历史数据相当长的时间,你也许可裁减日志来保证日志文件匿名。假如你仅对哪个URI被

访问感兴趣,而不是谁访问了它们,就可从access.log里抽取出该域。这样也让文件更小,并且减少

了隐私违背的风险。另一个技术是随机处理客户端IP地址。换句话说,就是创建一个过滤器,把真正的

IP地址映射到假的地址,前提是同一个真IP地址总是映射到同一个假IP。假如你在使用RFC 1413身份

验证协议或HTTP认证,也可考虑保持这些域匿名。


);
printf("%02X/%02X/%08X\n",
(($filn / $L2) / $L2) % $L1,
($filn / $L2) % $L2,
$filn);
}

这样使用它:

___FCKpd___58

要在第N个cache_dir里找到该文件,简单的进入到相应的目录,并列出或查看该文件:

___FCKpd___59



13.4 referer.log

可选的referer.log包含了来自客户端请求的Referer头部。为了使用该功能,必须在./configure时打

开--enable-referer-log选项。还必须用referer_log指令来指定一个路径。例如:

___FCKpd___60

假如想禁止referer.log,则可设置文件名为none。

Referer头部正常情况下包含一个URI,从这个URI获取到了请求(见RFC2616的14.36节)。例如,当web浏览器发布请求到某个内嵌图片时,Referer头部被设置成包含该图片的HTML网页的URI。当你点击HTML超链接时,它也被设置。某些web站点管理员使用Referer值来查找死链接。在使用Squid作为代理人模式时,你也许发现referer.log特别有用。

referer.log格式简单,仅有4个域。如下是一些示例:

___FCKpd___61

注意缺少Referer头部的请求不会被记录。这4个域描述如下:

  • 1. 时间戳

  • 请求时间,表现为Unix纪元以来的秒数,是毫秒级的。

注意的是,不像access.log,referer.log在Squid接受到完整请求时,会立刻记录。这样,referer.log条目在access.log之前发生,后者等待响应完成才记录。

  • 2. 客户端地址

  • 客户端地址跟access.log里的一样。log_fqdn和client_netmask指令也影响该日志文件。

  • 3. referer

  • 来自客户端请求的Referer头部值。注意referer值可能有空格字符或其他字符,在写referer.log前Squid不会对其进行编码。

  • 4. URI

  • 客户端正请求的URI。它匹配access.log里的URI。



13.5 useragent.log

可选的useragent.log包含来自客户端请求的User-Agent头部值。为了使用该功能,必须在运行./configure时打开--enable-useragent-log选项。还必须使用useragent_log指令来提供一个路径名。例如:

___FCKpd___62

User-Agent头部正常情况下包含了发起请求的user-agent的描述。大多数情形下,该描述只是简单的产品名列表和版本信息。你应该清楚应用程序可以轻易的提供伪造的user-agent信息。现代user-agent提供途径可定制该描述。甚至Squid在转发请求里能改变这个User-Agent头部。

useragent.log格式相对简单,看起来如下:

___FCKpd___63

不像其他日志文件,它仅有3个域:

  • 1. 客户端地址

  • 跟access.log里的一样。log_fqdn和client_netmask指令也影响该日志文件。

  • 2. 时间戳

  • 不像其他日志文件那样,用Unix纪元以来的秒数来描述时间,这里使用人工可读的格式。它是HTTP通用日志文件格式的时间戳,看起来如下:
    ___FCKpd___64
    注意方括号界定时间戳,它包含一个空格。也请注意,跟referer.log一样,这些条目在Squid接受到完整请求时,立刻被记录。

  • 3. user-agent

  • User-Agent头部的值。这些字串几乎总包含空格。在将其写入日志文件时,Squid不会编码User-Agent值。



13.6 swap.state

swap.state文件是目标写入cache目录、或从cache目录删除的日志写照。每个cache_dir有它自己的swap.state文件。当Squid启动时,它读取swap.state文件来重建cache目标的内存索引。这些文件对Squid管理来说,至关重要。

默认情况下,每个cache.state文件位于它相应的cache目录。这样,每个state文件自动驻留在每个cache_dir下。这点很有用--假如你想重新排序cache_dir行,或想从cache_dir列表里删除条目的话。

如果想将它们放在其他位置,可使用cache_swap_log指令来做:

___FCKpd___65

在此情况下,Squid对每个cache目录创建一个swap.state文件,并增加数字后缀。例如,假如有4个cache目录,Squid创建如下日志:

___FCKpd___66

在这个情形下,如果你要增加、删除、或重排序cache_dir行,就必须手工重命名swap.state文件,以保持事情一致。

技术上,swap.state格式是独立于存储机制的。然而,在当前版本的Squid里,所有的存储机制使用同一种格式。swap.state文件使用修正大小(48位)的二进制格式。各个域值以主机字节顺序记录,这样在不同的操作系统之间不便迁移。表13-3描述了swap.state日志条目的各个域的说明。


Table 13-3. swap.state entry fields

Name Size, in bytes Description op 1 Operation on the entry: added (1) or deleted (2). file number 4 Same as the fourth field of store.log, except it is stored in binary. timestamp 4 A timestamp corresponding to the time when the response was generated or last validated. Taken from the Date header for responses that have one. Stored as the number of seconds since the Unix epoch. lastref 4 A timestamp corresponding to the most recent access to the object. expires 4 The object's expiration time, taken from an Expires header or Cache-Control max-age directive. last-modified 4 The object's Last-Modified value. swap file size 4 The amount of space the object occupies on disk. This includes HTTP headers and other Squid-specific meta-information. refcount 2 The number of times this object has been requested. flags 2 Various internal flags used by Squid. key 16 The MD5 hash of the corresponding URI. Same as the key in store.log, except this one is stored in binary.



13.7 轮转日志

Squid不断的写日志,假如cache非常忙,那么在一段时间后,这些日志文件可能变得很大。某些操作系统甚至限制了文件的最大size(例如2G),假如写文件超过了这个size就会报错。为了保持日志文件容易管理,以及让Squid正常工作,必须定期轮转日志。

Squid有内建的功能用于轮转日志。可通过squid -k rotate命令来调用它,然后告诉Squid对每个日志文件保持多少份旧拷贝。例如,假如设置它为7,对每个日志文件会有8个版本:1个当前的,和7个旧的。

旧日志文件以数字扩展来重命名。例如,当执行一次轮转时,Squid重命名log.6到log.7,然后是log.5到log.6,依此类推。当前log变成log.0,并且Squid创建一个新的空文件,命名为log。

每次执行squid -k rotate时,Squid轮转下述文件:cache.log, access.log, store.log, useragent.log (假如激活), 以及referer.log (假如激活)。Squid也会创建最新版本的swap.state文件。然而请注意,swap.state不会以数字扩展形式来轮转。

Squid不会自己轮转日志,最好的办法是在crontab里自动执行。例如:

___FCKpd___67

假如你想编写自己的脚本来管理日志文件,Squid提供了一个有用的模式,简单的设置logfile_rotate指令为0。这样,当你运行squid -k rotate命令时,Squid简单的关闭当前日志文件,并且打开新的。如果操作系统允许重命名被其他进程打开的文件,则这点非常有用。下述shell脚本描述了一个思路:

___FCKpd___68



13.8 隐私和安全

Squid的日志文件特别是access.log,包含了用户的活跃记录,因此它受隐私问题支配。作为Squid管理员,你必须采取额外的小心来保证日志文件安全。最好的办法是限制访问Squid主机的人员的数量。假如这点行不通,那么就要谨慎的检查文件和目录许可,确保日志文件不会被非信任的、或未授权的用户访问。

也可利用client_netmask和strip_query_terms指令来保护用户隐私。前者让识别access.log里的用户困难;后者移除了URI查询条件以避免泄露用户私人信息。更多信息见13.2.4节。

如果想要保持历史数据相当长的时间,你也许可裁减日志来保证日志文件匿名。假如你仅对哪个URI被访问感兴趣,而不是谁访问了它们,就可从access.log里抽取出该域。这样也让文件更小,并且减少了隐私违背的风险。另一个技术是随机处理客户端IP地址。换句话说,就是创建一个过滤器,把真正的IP地址映射到假的地址,前提是同一个真IP地址总是映射到同一个假IP。假如你在使用RFC 1413身份验证协议或HTTP认证,也可考虑保持这些域匿名。