Arquivo de log de acesso Nginx separado somente para determinados pedidos

5

Até onde eu sei, o Nginx suporta por padrão 2 arquivos de log: error_log (rastreia problemas relacionados ao próprio servidor Nginx) e access_log (rastreia solicitações processadas pelo Nginx). Embora seja possível controlar o formato de access_log com a diretiva log_format , não consegui encontrar uma maneira de registrando apenas determinados pedidos em um arquivo separado e, portanto, gostaria de fazer a pergunta sobre SF como referência para futuros leitores:

Existe uma maneira de registrar certas solicitações em um arquivo de log diferente daquele definido por access_log ?

FYI O motivo dessa pergunta é que tenho uma regra que nega o acesso a rastreadores indesejados com um 200 (porque 403 daria a eles uma pista de que eles estão sendo bloqueados) e filtrando essas solicitações do access_log torna-se mais difícil.

    
por Max 01.06.2012 / 14:00

3 respostas

7

cjc me colocou no caminho certo. Usar access_log em uma instrução if por si só não é possível (você recebe um erro nginx: [emerg] "access_log" directive is not allowed here ). Portanto, a solução alternativa é a seguinte:

if ($http_user_agent ~* (crawler) ) {
  set $crawler 'yes';
}
location ~ .* {
  if ($crawler = 'yes') {
    access_log /var/log/nginx/blockedbots.log;
    return 200;
    }
}
    
por 01.06.2012 / 15:23
4

Você deve conseguir colocar uma diretiva access_log dentro de um bloco if , de acordo com a documentação:

link

Então, você deve ser capaz de fazer algo como:

if ($http_user_agent ~* (crawler) ) {
   access_log /path/to/other/log/file ;
}
    
por 01.06.2012 / 14:29
4

access_log suporta se:

(caminho access_log [formato [buffer = tamanho [flush = tempo]] [se = condição]];)

access_log /var/.... if $crawler;

Fonte:

link

    
por 15.07.2015 / 16:58