Насколько я могу судить, Nginx по умолчанию поддерживает 2 файла журнала: error_log
(отслеживает проблемы, связанные с самим сервером Nginx) и access_log
(отслеживает запросы, обрабатываемые Nginx). Хотя можно контролировать формат access_log
с log_format
директиве, мне не удалось найти способ записи в журнал только определенных запросов в отдельный файл, и поэтому я хотел бы задать вопрос о SF в качестве справки для будущих читателей:
Есть ли способ записывать определенные запросы в другой файл журнала, чем тот, который определен access_log
?
К вашему сведению, причина этого вопроса в том, что у меня есть правило, которое запрещает доступ нежелательным сканерам с 200 (потому что 403 дает им намек на то, что они заблокированы) и фильтрует эти запросы из access_log
становится сложнее.
cjc
поставил меня на правильный путь. С помощью access_log
в if
заявление само по себе невозможно (вы получите nginx: [emerg] "access_log" directive is not allowed here
ошибка). Таким образом, обходной путь выглядит следующим образом:
if ($http_user_agent ~* (crawler) ) {
set $crawler 'yes';
}
location ~ .* {
if ($crawler = 'yes') {
access_log /var/log/nginx/blockedbots.log;
return 200;
}
}
access_log поддерживает, если:
(путь к журналу доступа [формат [буфер = размер [flush = время]] [if = условие]];)
access_log /var/.... if $crawler;
Источник:
Вы должны иметь возможность поставить access_log
директива внутри if
блок, согласно документации:
http://wiki.nginx.org/HttpLogModule
Итак, вы должны уметь делать что-то вроде:
if ($http_user_agent ~* (crawler) ) {
access_log /path/to/other/log/file ;
}