По умолчанию Squid регистрирует всю информацию о доступе, включая «успехи» и «неудачи». Мне интересно регистрировать только «неудачи». Другими словами, я хочу сделать что-то вроде регистрации только кодов результатов Squid DENIED или, в качестве альтернативы, не регистрировать успешные HTTP-транзакции. Независимо от того, как я определяю «успех» и «неудачу», мне нужно иметь возможность более конкретно определить, какую информацию о доступе Squid будет записывать в файл журнала. Кто-нибудь знает, как это сделать?
решение1
Эту функциональность можно реализовать с помощьюACL-списки, хотя тут есть некоторые хитрости.
Главный трюк — убедиться, что вы случайно не проверяете двоичные соединения на наличие http_status
кодов. Squid никогда не видит коды состояния для двоичных соединений и выдаст предупреждение 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