1、squid 日志文件 access.log1.时间戳请求完成时间,以 Unix 纪元(UTC 1970-01-01 00:00:00)以来的秒数表示,它是毫秒级的。squid 使用这种格式而不是人工可读的时间格式,是为了简化某些日志处理程序的工作。可以使用一个简单的 perl 命令来转化 Unix 时间戳到本地时间,例如:perl -pe s/d+.d+/localtime($ access.log2.响应时间对 HTTP 事务来说,该域表明 squid 花了多少时间来处理请求。在 squid 接受到 HTTP 请求时开始计时,在响应完全送出后计时终止。响应时间是毫秒级的。对 ICP 查询来说
2、,响应时间通常是 0。这是因为 squid 回答 ICP 查询非常迅速。甚至,squid 在接受到ICP 查询和发送完响应之间,不会更新进程时钟。尽管时间值是毫秒级的,但是精度可能是 10 毫秒。在 squid 负载繁重时,计时变得没那么精确。3.客户端地址该域包含客户端的 IP 地址,或者是主机名-假如激活了 log_fqdn。出于安全或隐私的理由,你可能需要使用 client_netmask 指令来掩盖客户端地址的一部分。然而,这样让来自同一客户端的组请求变得不可能。4.结果/状态码该域包含 2 个 token,以斜杠分隔。第一个 token 叫结果码,它把协议和事务结果(例如 TCP_H
3、IT 或UDP_DENIED)进行归类。这些是 squid 专有的编码,在 13.2.1 节里有定义。以 TCP_开头的编码指 HTTP请求,以 UDP_开头的编码指 ICP 查询。第 2 个 token 是 HTTP 响应状态码(例如 200,304,404 等)。状态码通常来自原始服务器。在某些情形下,squid 可能有义务自己选择状态码。这些编码在 HTTP 的 RFC 里定义,在随后的 Table 13-1 里有概述。5.传输 size该域指明传给客户端的字节数。严格的讲,它是 squid 告诉 TCP/IP 协议栈去发送给客户端的字节数。这就是说,它不包括 TCP/IP 头部的 ov
4、erhead。也请注意,传输 size 正常来说大于响应的 Content-Length。传输 size 包括了 HTTP 响应头部,然而 Content-Length 不包括。传输 size 可用于近似的带宽使用分析,但并非精确的 HTTP 实体 size 计算。假如需要了解响应的Content-Length,可在 store.log 里找到它。6.请求方式该域包含请求方式。因为 squid 客户端可能使用 ICP 或 HTTP,请求方式就可能是 HTTP-或 ICP-这 2 种。最普通的 HTTP 请求方式是 GET。ICP 查询总以 ICP_QUERY 的形式被记载。请见 6.1.2.8
5、 节关于 squid 了解的 HTTP 方式列表。7.URI该域包含来自客户端请求的 URI。大多数记录下来的 URI 实际是 URL(例如,它们有主机名)。Squid 对某些失败使用特殊的记录格式。例如 Squid 不能解析 HTTP 请求,或者不能决定 URI,这时你可能见到类似于“error:invalid-request.“ 的字串出现在 URI 的位置。例如:1066036250.603 310 192.0.34.70 NONE/400 1203 GET error:invalid-request - NONE/- - 另外在该域里,也请留心 URI 里的空格字符。取决于 uri_w
6、hitespace 设置,squid 可能在日志文件里打印 URI 时带空格字符。若发生这种情况,则阅读 access.log 文件的日志分析工具可能会遇到麻烦。在记日志时,squid 删掉了在第一个问号(?)之后的所有 URI 字符,除非禁用了 strip_query_terms 指令。8.客户端身份Squid 有 2 种不同的办法来决定用户的身份。一种是 RFC 1413 身份协议,另一种来自 HTTP 验证头部。Squid 试图基于 ident_lookup_access 规则进行身份查询,假如有的话。另外,假如使用代理验证(或在代理人模式下的规范服务验证),squid 会在该域放置给定
7、的用户名。假如 2 者都提供给 squid 一个用户名,并且你使用了原始 access.log 格式,那么 HTTP 验证名字会记录下来,RFC 1413 名字会忽略掉。普通日志文件格式会把两者都独立的记录。9.对端编码/对端主机对端信息包含了 2 个 token,以斜杠分隔。它仅仅与 cache 丢失的请求有关。第一个 token 指示如何选择下一跳,第二个 token 是下一跳的地址。对端编码列在 13.2.3 节里。当 squid 发送一个请求到邻居 cache 时,对端主机地址是邻居的主机名。假如请求是直接送到原始服务器的,则 squid 会写成原始服务器的 IP 地址或主机名-假如禁
8、用了 log_ip_on_direct。NONE/-这个值指明squid 不转发该请求到任何其他服务器。10.内容类型原始 access.log 的默认的最后一个域,是 HTTP 响应的内容类型。squid 从响应的 Content-Type 头部获取内容类型值。假如该头部丢失了,squid 使用一个横杠(-)代替。假如激活了 log_mime_headers 指令,squid 在每行追加 2 个附加的域:11.HTTP 请求头部Squid 编码 HTTP 请求头部,并且在一对方括号之间打印它们。方括号是必须的,因为 squid 不编码空格字符。编码方案稍许奇怪。回车(ASCII 13)和换行
9、(ASCII 10)分别打印成r 和n。其他不可打印的字符以 RFC 1738 风格来编码,例如 Tab(ASCII 9)变成了%09。12.HTTP 响应头部Squid 编码 HTTP 响应头部,并且在一对方括号之间打印它们。注意这些是发往客户端的头部,可能不同于从原始服务器接受到的头部。Squid 只有在整个响应发送到客户端完成以后,才写 access.log 日志。这点允许 squid 在日志文件里包含请求和响应两者信息。然而,需要花费数分钟甚至数小时才能完成的事务,请求期间的日志在access.log 里不可见。当这类型的事务呈现出性能或策略问题时,access.log 可能对你没有帮
10、助。代替的,可使用 cache 管理器来浏览挂起事务的列表(见 14 章)。13.2.1 access.log 结果编码 相应于 HTTP 请求,下列标签可能出现在 access.log 文件的第四个域。TCP_HIT Squid 发现请求资源的貌似新鲜的拷贝,并将其立即发送到客户端。TCP_MISS Squid 没有请求资源的 cache 拷贝。TCP_REFERSH_HIT Squid 发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器返回 304(未修改)响应,指示 squid 的拷贝仍旧是新鲜的。TCP_REF_FAIL_HIT Squid 发现请求资源的貌似陈旧的拷
11、贝,并发送确认请求到原始服务器。然而,原始服务器响应失败,或者返回的响应 Squid 不能理解。在此情形下,squid 发送现有 cache 拷贝(很可能是陈旧的)到客户端。TCP_REFRESH_MISS Squid 发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器响应新的内容,指示这个 cache 拷贝确实是陈旧的。TCP_CLIENT_REFRESH_MISS Squid 发现了请求资源的拷贝,但客户端的请求包含了 Cache-Control: no-cache 指令。Squid 转发客户端的请求到原始服务器,强迫 cache 确认。TCP_IMS_HIT 客户端发送
12、确认请求,Squid 发现更近来的、貌似新鲜的请求资源的拷贝。Squid 发送更新的内容到客户端,而不联系原始服务器。TCP_SWAPFAIL_MISS Squid 发现请求资源的有效拷贝,但从磁盘装载它失败。这时 squid 发送请求到原始服务器,就如同这是个 cache 丢失一样。TCP_NEGATIVE_HIT 在对原始服务器的请求导致 HTTP 错误时,Squid 也会 cache 这个响应。在短时间内对这些资源的重复请求,导致了否命中。negative_ttl 指令控制这些错误被 cache 的时间数量。请注意这些错误只在内存cache,不会写往磁盘。下列 HTTP 状态码可能导致否
13、定 cache(也遵循于其他约束): 204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504。TCP_MEM_HIT Squid 在内存 cache 里发现请求资源的有效拷贝,并将其立即发送到客户端。注意这点并非精确的呈现了所有从内存服务的响应。例如,某些 cache 在内存里,但要求确认的响应,会以 TCP_REFRESH_HIT, TCP_REFRESH_MISS 等形式记录。TCP_DENIED 因为 http_access 或 http_reply_access 规则,客户端的请求被拒绝了。注意被 http_access 拒
14、绝的请求在第 9 域的值是 NONE/-,然而被 http_reply_access 拒绝的请求,在相应地方有一个有效值。TCP_OFFLINE_HIT 当 offline_mode 激活时,Squid 对任何 cache 响应返回 cache 命中,而不用考虑它的新鲜程度。TCP_REDIRECT 重定向程序告诉 Squid 产生一个 HTTP 重定向到新的 URI(见 11.1 节)。正常的,Squid 不会记录这些重定向。假如要这样做,必须在编译 squid 前,手工定义 LOG_TCP_REDIRECTS 预处理指令。NONE 无分类的结果用于特定错误,例如无效主机名。相应于 ICP
15、查询,下列标签可能出现在 access.log 文件的第四域。UDP_HIT Squid 在 cache 里发现请求资源的貌似新鲜的拷贝。UDP_MISS Squid 没有在 cache 里发现请求资源的貌似新鲜的拷贝。假如同一目标通过 HTTP 请求,就可能是个 cache丢失。请对比 UDP_MISS_NOFETCH。UDP_MISS_NOFETCH 跟 UDP_MISS 类似,不同的是这里也指示了 Squid 不愿去处理相应的 HTTP 请求。假如使用了-Y 命令行选项,Squid 在启动并编译其内存索引时,会返回这个标签而不是 UDP_MISS。UDP_DENIED 因为 icp_ac
16、cess 规则,ICP 查询被拒绝。假如超过 95%的到某客户端的 ICP 响应是 UDP_DENIED,并且客户端数据库激活了(见附录 A),Squid 在 1 小时内,停止发送任何 ICP 响应到该客户端。若这点发生,你也可在 cache.log 里见到一个警告。UDP_INVALID Squid 接受到无效查询(例如截断的消息、无效协议版本、URI 里的空格等)。Squid 发送 UDP_INVALID响应到客户端。13.2.2 HTTP 响应状态码 Table 13-1 列出了数字 HTTP 响应 CODE 和理由短句。注意 Squid 和其他 HTTP 客户端仅仅关注这些数字值。理由
17、短句是纯解释性的,不会影响响应的意义。对每个状态码,也提供了一个到 RFC 2616 的具体节的索引。注意状态码 0 和 600 是 squid 使用的非标准的值,不会在 RFC 里提到。Table 13-1. HTTP response status codes CodeReason phrase RFC 2616 section 0 No Response Received (Squid-specific) N/A1xx Informational 10.1100 Continue 10.1.1101 Switching Protocols 10.1.22xx Successful 10.
18、2200 OK 10.2.1201 Created 10.2.2202 Accepted 10.2.3203 Non-Authoritative Information 10.2.4204 No Content 10.2.5205 Reset Content 10.2.6206 Partial Content 10.2.73xx Redirection 10.3300 Multiple Choices 10.3.1301 Moved Permanently 10.3.2302 Found 10.3.3303 See Other 10.3.4304 Not Modified 10.3.5305
19、Use Proxy 10.3.6306 (Unused) 10.3.7307 Temporary Redirect 10.3.84xx Client Error 10.4400 Bad Request 10.4.1401 Unauthorized 10.4.2402 Payment Required 10.4.3403 Forbidden 10.4.4404 Not Found 10.4.5405 Method Not Allowed 10.4.6406 Not Acceptable 10.4.7407 Proxy Authentication Required 10.4.8408 Reque
20、st Timeout 10.4.9409 Conflict 10.4.10410 Gone 10.4.11411 Length Required 10.4.12412 Precondition Failed 10.4.13413 Request Entity Too Large 10.4.14414 Request-URI Too Long 10.4.15415 Unsupported Media Type 10.4.16416 Requested Range Not Satisfiable 10.4.17417 Expectation Failed 10.4.185xx Server Err
21、or 10.5500 Internal Server Error 10.5.1501 Not Implemented 10.5.2502 Bad Gateway 10.5.3503 Service Unavailable 10.5.4504 Gateway Timeout 10.5.5505 HTTP Version Not Supported 10.5.66xx Proxy Error N/A600 Unparseable Response Headers (Squid-specific)N/A假如 Squid 从原始服务器没有接受到任何响应,你可在 access.log 里看到状态码 0。
22、假如 Squid 接受到的响应没有包含 HTTP 头部,就会出现状态码 600。在少数情况下,某些原始服务器仅发送响应 body,而忽略了任何头部。13.2.3 access.log 对端编码 下列编码可能出现在 access.log 的第 9 域。请参考 10.10 节关于 Squid 如何对 cache 丢失情况,选择有效的下一跳。NONE 这指明 Squid 对本次请求,不会与任何其他服务器(邻居或原始服务器)通信。它通常与 cache 命中、拒绝请求、cache 管理请求、错误、和所有的 ICP 查询这些类型联合出现。DIRECT Squid 直接转发请求到原始服务器。该域的第 2 半
23、部分显示原始服务器的 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。F
24、IRST_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_PARE
25、NT 这点类似 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 离原始服务器
26、近于任何其他邻居。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,因为没有其他方法能选择可行的下一跳。注意大部分上述编码
27、可能以 TIMEOUT_开头,这表明在等待 ICP/HTCP 响应时发生超时。例如:1066038165.382 345 193.233.46.21 TCP_MISS/200 2836 GET http:/www.caida.org/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 该指令默认
28、激活,导致 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 章),你可能想要普
29、通日志文件格式。普通格式或许也对你现有的日志文件分析工具有用。使用该指令来激活普通格式: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 个域。每个域都以方括号引用起来,便于分析。某些字
30、符会被编码来保证日志文件可读。Table 13-2 显示了这些编码方案。Table 13-2. Character encoding rules for HTTP headers in access.logCharacter EncodingNewline nCarriage return rBackslash %5b %5d% %25ASCII 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