下列编码可能出现在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 %<st %rm %ru %un %Sh/%<A %mt

参数解释如下

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

%<a

Server or peer IP address

%<p

Server or peer port number

%<A

Server IP address or peer name

%la

Local IP address where the request was accepted

%lp

Local port where the request was accepted

%lA

Local port name where the request was accepted

%ts

Date of request, seconds since epoch

%{format}tl

Date of request, strftime format (localtime)

%{format}tg

Date of request, strftime format (gmt)

%tu

Date of request, sub-second component

%tr

Time to serve the request, in milliseconds

%{header}>h

Request header

%{header:element}>h

Named request header field element (list headers)

%{header:separator element}>h

Named request header field element, using "separator" as field separator (it can be any non-alphanumeric single character)

%>h

All request header

%{header}<h

Request headers, as for <..h above

%un

Authenticated user name or dash

%ur

Authenticated user realm or dash

%us

Authenticated user scheme or dash

%ui

Ident user name

%Hs

HTTP status code (200, 404, 407, etc)

%Ht

HTTP status text (Not found, etc)

%Ss

Squid status code (TCP_HIT, TCP_MISS etc)

%Se

Squid error code (ERR_DENIED, ERR_...)

%Sh

Squid hierarchy code (FIRST_UP_PARENT, etc)

%mt

MIME type of the request

%rm

Request method

%ru

Request URL, without the query string

%rq

Request query string, including ?

%rp

Request protocol (i.e. HTTP/1.1)

%ps

Peer selection status (DIRECT, PARENT, CD_PARENT_HIT, etc. including the TIMEDOUT_ variant)

%>sl

Size of request line

%>sh

Size of request headers, including request line

%>sH

Size of request headers, excluding request line

%>sb

Size of request body, raw received bytes

%>sB

Size of request body, excluding transfer encoding

%>st

Total size of request

%<sl

Size of reply status line

%<sh

Size of reply headers, including status line

%<sH

Size of reply headers, excluding status line

%<sb

Size of reply body, raw transmitted bytes

%<sB

Size of reply body, excluding transfer encoding

%<st

Total size of reply

%%

A literal %

 

不记图片类访问日志设置

acl nolog urlpath_regex //.gif //.jpg //.css //.js //.swf

access_log /data/squid/var/logs/access.log common !nolog