13.2.3 access.log对端编码
下列编码可能出现在access.log的第9域。请参考10.10节关于Squid如何对cache丢失情况,选择有
效的下一跳。
NONE
这指明Squid对本次请求,不会与任何其他服务器(邻居或原始服务器)通信。它通常与cache命中、
拒绝请求、cache管理请求、错误、和所有的ICP查询这些类型联合出现。
DIRECT
Squid直接转发请求到原始服务器。该域的第2半部分显示原始服务器的IP地址,或主机名--假如禁止
了log_ip_on_direct。
SIBLING_HIT
在姐妹cache返回ICP或HTCP命中后,Squid发送请求到姐妹cache。
PARENT_HIT
在父cache返回ICP或HTCP命中后,Squid发送请求到父cache。
DEFAULT_PARENT
Squid选择该父cache,因为其在squid.conf的cache_peer行里被标志为default。
FIRST_UP_PARENT
Squid转发请求到该父cache,因为它是位于已知活跃列表里的第一个父cache。
FIRST_PARENT_MISS
Squid转发请求到该父cache,它第一个响应ICP/HTCP丢失消息。换句话说,对这个特殊的
ICP/HTCP查询,在这个特殊时刻,被选中的父cache有最佳的往返时间(RTT)。注意标准RTT可能
被人工矫正过,取决于cache_peer指令的weight选项。
CLOSEST_PARENT_MISS
Squid选择该父cache,因为它报告到原始服务器的RTT最低。这点仅在2个cache都激活了netdb,
并且原始服务器(或在同一子网内的其他server)返回ICMP ping消息。
CLOSEST_PARENT
这点类似CLOSEST_PARENT_MISS,除了RTT计算不是来自ICP/HTCP响应消息外。代替的,它们
来自Squid保留的更老的计算方式,例如netdb交换功能。
CLOSEST_DIRECT
Squid基于netdb算法,转发请求到原始服务器。这点在满足下述任何条件时发生:
- 1)在Squid和原始服务器之间的RTT小于配置的minimum_direct_rtt值。
- 2)在Squid和原始服务器之间的标准路由跳数少于配置的minimum_direct_hops值。
- 3)在ICP/HTCP响应里返回的RTT值,指示Squid离原始服务器近于任何其他邻居。
ROUNDROBIN_PARENT
Squid转发请求到该父cache,因为设置了round-robin选项,并且它有最低的使用计数器。
CD_PARENT_HIT
Squid基于cache摘要算法(见10.7节)转发请求到该父cache。
CD_SIBLING_HIT
Squid基于cache摘要算法转发请求到该姐妹cache。
CARP
Squid选择该父cache,基于cache数组路由协议算法(见10.9节)。
ANY_PARENT
作为最后的手段,Squid选择该父cache,因为没有其他方法能选择可行的下一跳。
注意大部分上述编码可能以TIMEOUT_开头,这表明在等待ICP/HTCP响应时发生超时。例如:
1066038165.382 345 193.233.46.21 TCP_MISS/200 2836
GET http://www./home/./images/home.jpg
TIMEOUT_CLOSEST_DIRECT/213.219.122.19 image/jpeg
可使用icp_query_timeout指令来调整超时。
13.2.4 影响access.log的配置指令
下列配置文件指令会影响到access.log。
13.2.4.1 log_icp_queries
该指令默认激活,导致squid记录所有的ICP查询。假如运行了一个繁忙的父cache,这点可能让
access.log文件变得巨大。为了节省磁盘空间,可禁止该指令:
log_icp_queries off
假如禁止了ICP查询的日志,我建议你监视查询数量--通过cache管理器或SNMP。
13.2.4.2 emulate_httpd_log
access.log文件有2种格式:普通格式和原始格式。普通格式就如同大部分HTTP服务器(如Apache)
的日志格式一样。它包含的信息少于Squid的原始格式。然而,假如运行Squid在代理人模式下(见
15章),你可能想要普通日志文件格式。普通格式或许也对你现有的日志文件分析工具有用。使用该
指令来激活普通格式:
emulate_httpd_log on
请见http://www./Daemon/User/Config/Logging.html#common-logfile-format 关于
该格式的描述。
13.2.4.3 log_mime_hdrs
使用log_mime_hdrs让squid记录HTTP请求和响应的头部:
log_mime_headers on
在激活时,squid追加请求和响应头部到access.log。这会在每行增加2个域。每个域都以方括号引用
起来,便于分析。某些字符会被编码来保证日志文件可读。Table 13-2显示了这些编码方案。
Table 13-2. Character encoding rules for HTTP headers in access.log
Character |
Encoding |
Newline |
\n |
Carriage return |
\r |
Backslash |
\\ |
[ |
%5b |
] |
%5d |
% |
%25 |
ASCII 0-31 |
%xx (hexadecimal value) |
ASCII 127-255 |
%xx (hexadecimal value) |
13.2.4.4 log_fqdn
Squid默认把客户端IP地址放在access.log里。也可以记录可用的主机名,激活如下指令:
log_fqdn on
这点让Squid在接受到请求时,对客户端的地址发起反向DNS查询。假如在请求完成时查到了主机名,
Squid就将它放在第3域。
13.2.4.5 ident_lookup_access
该访问规则列表决定Squid是否对客户端的TCP连接发起RFC 1413身份查询。默认情况下,Squid不
会发布身份查询。为了激活这点,简单的增加一个或多个规则:
acl All src 0/0
ident_lookup_access allow All
假如在请求完成时查到了答案,Squid将其放在第8域。假如同时使用了HTTP验证,从验证得到的用
户名会取代身份查询答案。
13.2.4.6 log_ip_on_direct
当Squid转发cache丢失到原始服务器时,它在第9域记录原始服务器的IP地址。可以禁止这个指令,
以便squid记录主机名:
log_ip_on_direct off
在此情形下,主机名来自于URI。假如URI包含了IP地址,Squid不会将其转换为主机名。
13.2.4.7 client_netmask
该指令存在主要是为了保护用户的隐私。不同于记录完整的IP地址,你也可以掩盖一些位。例如:
client_netmask 255.255.255.0
在此设置下,access.log里的所有客户端IP地址的最后一个八位组是0:
1066036246.918 35 163.11.255.0 TCP_IMS_HIT/304 266 GET http://...
1066036246.932 16 163.11.255.0 TCP_IMS_HIT/304 266 GET http://...
1066036247.616 313 140.132.252.0 TCP_MISS/200 1079 GET http://...
1066036248.598 44459 140.132.252.0 TCP_MISS/500 1531 GET http://...
1066036249.230 17 170.210.173.0 TCP_IMS_HIT/304 265 GET http://...
1066036249.752 2135 140.132.252.0 TCP_MISS/200 50230 GET http://...
1066036250.467 4 170.210.173.0 TCP_IMS_HIT/304 265 GET http://...
1066036250.762 102 163.11.255.0 TCP_IMS_HIT/304 265 GET http://...
1066036250.832 20 163.11.255.0 TCP_IMS_HIT/304 266 GET http://...
1066036251.026 74 203.91.150.0 TCP_CLIENT_REFRESH_MISS/304 267 GET http://...
13.2.4.8 strip_query_terms
该指令是另一个隐私保护功能。在记录请求前,Squid删除了查询条件。假如日志文件不幸落入坏人之
手,他们不会找到任何用户名和密码。当该指令激活时,在问号(?)之后的所有字节被删除。例如,某
个URI如下:
http://auto.search./response.asp?MT=www.kimo.com.yw&srch=3&prov=&utf8
会被记录为:
http://auto.search./response.asp?
13.2.4.9 uri_whitespace
早前我提到过出现在某些URI里的空格字符的问题。RFC申明URI必须不包括空格字符,但在实际中情
况并非如此。uri_whitespace指令指明Squid如何处理这种情况。允许的设置是:strip (default),
deny, allow, encode, 和chop。在这些设置里,strip,encode和chop保证URI域不包含任何空格
字符(空格字符会给access.log增加多余的域)。
allow设置允许请求不加修改的通过Squid。它很可能会给重定向器和日志文件解析器带来麻烦。与之
相反的是deny设置,它导致Squid拒绝这种请求。用户会接受到错误消息,但请求仍带着空格字符被
记录到access.log。
假如设置为encode,Squid将空格字符按RFC 1738规范来编码。这点其实用户代理应该先做到。
chop设置导致Squid把第一个空格字符后的URI都截断。
默认设置是strip,它让Squid从URI里移除空格字符。这确保日志文件解析器和重定向器工作正常,但
可能会破坏某些事情,例如不正确编码的搜索引擎查询。
13.2.4.10 buffered_logs
默认情况下,Squid禁止写cache.log文件的buffer,这允许你运行tail -f 命令实时的观察日志文件变
化。假如你认为这点导致不必要的性能开销,就可以禁用buffer:
buffered_logs off
然而,除非以完整debug模式运行Squid,这点可能无关紧要。注意该选项仅仅影响cache.log。其他
的日志文件总使用非缓冲的写方式。
13.2.5 access.log分析工具
access.log包含很多信息,远不止你简单的浏览该文件所见。为了完整的浏览,必须使用第三方的日
志文件分析包。你可在Squid的web页面的链接里,找到它们的列表。或者直接访问:
http://www./Scripts/.
最流行的工具之一是Calamaris -- 一个Perl脚本,解析日志文件并产生基于文本的或HTML的报告。
它提供关于会话的详细分类包括请求方式、客户端IP地址、原始服务器域名、内容类型、文件名扩展、
响应size、以及更多。Calamaris也报告ICP查询会话,甚至其他cache产品的日志分析。其站点是:
http://calamaris..
Squeezer以及它的派生Squeezer2,是Squid专有的分析工具。它们提供许多统计,能帮助你了解
Squid的性能,特别是在有邻居cache时。两者都产生HTML文件作为输出。站点的
Logfile Analysis页有这些程序的链接。
Webalyzer是另一个有用工具。它运行快速,并且产生带表格和柱形统计表的HTML页面。它原始是
设计成分析原始服务器的访问日志的。尽管它能解析Squid的日志,但不会报告诸如命中率和响应时间
的事件。它使用的某些条款不同于我的做法。例如,Webalyzer把任何请求叫做一个"命中",这不同于
cache命中。它也把"页面"和"文件"加以区别。更多信息请访问Webalyzer的主页:
http://www./webalyzer/.
13.3 store.log
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哈希值)。
如你所见,这些都是相对低级的信息,在日常管理中可能用不上。除非你要做专业的分析,或打算
debug某程序,否则store.log可有可无。可以如下来禁止它:
cache_store_log none
跟其他日志文件一样,Squid将最新的日志条目写到该文件的末尾。某个给定的URI可能出现在日志文
件里多次。例如,它先被cache,然后删除,接着又cache住。仅仅最近来的日志条目才反映目标的
当前值。
store.log是文本基础的,看起来如下:
1067299212.411 RELEASE -1 FFFFFFFF A5964B32245AC98592D83F9B6EA10B8D 206
1067299212 1064287906 -1 application/octet-stream 6840/6840
GET http://download./msdownload/update/v3-19990518/cab...
1067299212.422 SWAPOUT 02 0005FD5F 6F34570785CACABC8DD01ABA5D73B392 200
1067299210 1057899600 -1 image/gif 1125/1125
GET http://forum./shf./images/nav_members1.gif
1067299212.641 RELEASE -1 FFFFFFFF B0616CB4B7280F67672A40647DD08474 200
1067299212 -1 -1 text/html -1/67191
GET http://www./
1067299212.671 RELEASE -1 FFFFFFFF 5ECD93934257594825659B596D9444BC 200
1067299023 1034873897 1067299023 image/jpeg 3386/3386
GET http://ebiz0./abc/ebiz/_EBIZ_3922eabf57d44e2a4c3e7cd234a...
1067299212.786 RELEASE -1 FFFFFFFF B388F7B766B307ADEC044A4099946A21 200
1067297755 -1 -1 text/html -1/566
GET http://www./pages/100303pic15.cfm
1067299212.837 RELEASE -1 FFFFFFFF ABC862C7107F3B7E9FC2D7CA01C8E6A1 304
1067299212 -1 1067299212 unknown -1/0
GET http://ebiz0./abc/ebiz/_EBIZ_3922eabf57d44e2a4c3e7cd234a...
1067299212.859 RELEASE -1 FFFFFFFF 5ED2726D4A3AD83CACC8A01CFDD6082B 304
1066940882 1065063803 -1 application/x-javascript -1/0
GET http://www./scripts/header_footer.js
每个日志条目包含如下13个域: