默认情况下,Squid 会记录所有访问信息,包括“成功”和“失败”。我只对记录“失败”感兴趣。换句话说,我想做一些事情,比如只记录 Squid DENIED 结果代码,或者不记录成功的 HTTP 事务。无论我如何定义“成功”和“失败”,我都需要能够更具体地定义 Squid 将写入日志文件的访问信息类型。有人知道如何做到这一点吗?
答案1
您可以使用以下方式实现此功能ACL,不过其中还是有一些技巧的。
主要的技巧是确保你不会意外地检查二进制连接的代码。Squid 永远不会看到二进制连接的状态代码,如果你搞砸了,它会对它看到的二进制连接http_status
发出警告。cache.log
下面是一个示例配置,它将把所有 http 成功和重定向以及完成打开套接字的所有二进制连接(除此之外我们没有成功/失败的可见性)写入success.log
,并将所有 http 失败代码和无法打开套接字的二进制连接写入failure.log
。
acl CONNECT method CONNECT
# http status codes (http://wiki.squid-cache.org/SquidFaq/SquidLogs)
acl success_codes http_status 100-199 # informational
acl success_codes http_status 200-299 # successful transactions
acl success_codes http_status 300-399 # redirection
acl failure_codes http_status 400-499 # client error
acl failure_codes http_status 500-599 # server error
acl success_hier hier_code HIER_DIRECT
acl failure_hier hier_code HIER_NONE
acl failure all-of CONNECT failure_hier
acl failure all-of !CONNECT failure_codes
acl success all-of CONNECT success_hier
acl success all-of !CONNECT success_codes
access_log stdio:/usr/local/squid/var/logs/success.log logformat=squid success
access_log stdio:/usr/local/squid/var/logs/failure.log logformat=squid failure
此配置的问题在于,它会禁用默认日志文件,并且不会记录任何与这两个 ACL 不匹配的内容。现在,我非常有信心我已经很好地编写了 ACL,并且已经考虑到了所有可能性,但这仍然会让我感到紧张,因此您可能需要添加另一个日志文件,以捕获任何恰好错过两个 ACL 的内容
access_log stdio:/usr/local/squid/var/logs/unknown.log logformat=squid !success !failure
或者你可以直接定义success
并设置失败!success
acl CONNECT method CONNECT
# http status codes (http://wiki.squid-cache.org/SquidFaq/SquidLogs)
acl success_codes http_status 100-199 # informational
acl success_codes http_status 200-299 # successful transactions
acl success_codes http_status 300-399 # redirection
acl success_hier hier_code HIER_DIRECT
acl failure_hier hier_code HIER_NONE
acl success all-of CONNECT success_hier
acl success all-of !CONNECT success_codes
access_log stdio:/usr/local/squid/var/logs/success.log logformat=squid success
access_log stdio:/usr/local/squid/var/logs/failure.log logformat=squid !success