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