Назад | Перейти на главную страницу

Отдельный файл журнала доступа Nginx только для определенных запросов

Насколько я могу судить, 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;

Источник:

http://nginx.org/en/docs/http/ngx_http_log_module.html

Вы должны иметь возможность поставить access_log директива внутри if блок, согласно документации:

http://wiki.nginx.org/HttpLogModule

Итак, вы должны уметь делать что-то вроде:

if ($http_user_agent ~* (crawler) ) {
   access_log /path/to/other/log/file ;
}