下列编码可能出现在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.caida.org/home/./p_w_picpaths/home.jpg TIMEOUT_CLOSEST_DIRECT/213.219.122.19 p_w_picpath/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.w3.org/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.msn.com/response.asp?MT=www.kimo.com.yw&srch=3&prov=&utf8
会被记录为:
http://auto.search.msn.com/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.squid-cache.org/Scripts/.
最流行的工具之一是Calamaris -- 一个Perl脚本,解析日志文件并产生基于文本的或HTML的报告。它提供关于会话的详细分类包括请求方式、客户端IP地址、原始服务器域名、内容类型、文件名扩展、响应size、以及更多。Calamaris也报告ICP查询会话,甚至其他cache产品的日志分析。其站点是:
http://calamaris.cord.de.
Squeezer以及它的派生Squeezer2,是Squid专有的分析工具。它们提供许多统计,能帮助你了解Squid的性能,特别是在有邻居cache时。两者都产生HTML文件作为输出。squid-cache.org站点的Logfile Analysis页有这些程序的链接。
Webalyzer是另一个有用工具。它运行快速,并且产生带表格和柱形统计表的HTML页面。它原始是
设计成分析原始服务器的访问日志的。尽管它能解析Squid的日志,但不会报告诸如命中率和响应时间
的事件。它使用的某些条款不同于我的做法。例如,Webalyzer把任何请求叫做一个"命中",这不同于
cache命中。它也把"页面"和"文件"加以区别。更多信息请访问Webalyzer的主页:
http://www.mrunix.net/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.windowsupdate.com/msdownload/update/v3-19990518/cab... 1067299212.422 SWAPOUT 02 0005FD5F 6F34570785CACABC8DD01ABA5D73B392 200 1067299210 1057899600 -1 p_w_picpath/gif 1125/1125 GET http://forum.topsportsnet.com/shf./p_w_picpaths/nav_members1.gif 1067299212.641 RELEASE -1 FFFFFFFF B0616CB4B7280F67672A40647DD08474 200 1067299212 -1 -1 text/html -1/67191 GET http://www.tlava.com/ 1067299212.671 RELEASE -1 FFFFFFFF 5ECD93934257594825659B596D9444BC 200 1067299023 1034873897 1067299023 p_w_picpath/jpeg 3386/3386 GET http://ebiz0.ipixmedia.com/abc/ebiz/_EBIZ_3922eabf57d44e2a4c3e7cd234a... 1067299212.786 RELEASE -1 FFFFFFFF B388F7B766B307ADEC044A4099946A21 200 1067297755 -1 -1 text/html -1/566 GET http://www.evenflowrocks.com/pages/100303pic15.cfm 1067299212.837 RELEASE -1 FFFFFFFF ABC862C7107F3B7E9FC2D7CA01C8E6A1 304 1067299212 -1 1067299212 unknown -1/0 GET http://ebiz0.ipixmedia.com/abc/ebiz/_EBIZ_3922eabf57d44e2a4c3e7cd234a... 1067299212.859 RELEASE -1 FFFFFFFF 5ED2726D4A3AD83CACC8A01CFDD6082B 304 1066940882 1065063803 -1 application/x-javascript -1/0 GET http://www.bellsouth.com/scripts/header_footer.js
每个日志条目包含如下13个域:
1. 时间戳
事件何时发生,表现为Unix纪元以来的秒数,它是毫秒级的。
2. 动作
cache目标发生的动作。该域有3个可能值:SWAPOUT,RELEASE,和SO_FAIL。
1)SWAPOUT在Squid成功的存储目标到磁盘时发生。某些目标例如那些消极cache的
,仅保存在内存而不是磁盘,Squid不会在store.log里记录它们。
2)SO_FAIL表明Squid不能完整的存储目标到磁盘。多半意味着存储机制拒绝以写方式
打开新的磁盘文件。
3)RELEASE在Squid从cache里删除目标,或首先就决定响应不可存储时发生。
3. 目录号
目录号是十进制小数形式,它是个到cache目录的7位索引。对没有存储到磁盘的目标,该域包
含-1值。
4. 文件号
文件号是25位的标识符,内在的被squid使用。它被写成8字符的十六进制号。对UFS基础的存
储机制,有算法可以转换文件号到路径名(见13.3.1节)。没有存储到磁盘的目标,没有有效
的文件号。对这些目标,该域的值是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在相应域放置一个疑问号。
在squid设置有日志格式设置
logformat squid %ts.%03tu %6tr %>a %Ss/%03Hs % 参数解释如下 Field name syntax keys: {} modifier or argument. Also used to specify header names > request (client) 客户请求 < reply (server) 服务端回应 a address 访问用户ip地址 A address name 访问用户电脑名称 h all headers 浏览器头信息 i ident p port 端口 r request line (no query) t time 访问时间 u user l local address/port (where request was accepted) %>a Client source IP address %>A Client FQDN %>p Client source port