Como gerar variável no log nginx para depuração

83

Estou testando o nginx e quero gerar variáveis ​​para os arquivos de log. Como posso fazer isso e qual arquivo de log será (acesso ou erro).

lulalala
fonte

Respostas:

143

Você pode enviar valores de variável nginx através de cabeçalhos. Útil para o desenvolvimento.

add_header X-uri "$uri";

e você verá nos cabeçalhos de resposta do seu navegador:

X-uri:/index.php

Às vezes faço isso durante o desenvolvimento local.

Também é útil para informar se uma subseção está sendo executada ou não. Polvilhe-o dentro de suas cláusulas para ver se eles estão sendo usados.

location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ {
    add_header X-debug-message "A static file was served" always;
    ...
}

location ~ \.php$ {
    add_header X-debug-message "A php file was used" always;
    ...
}

Portanto, visitar um URL como http://www.example.com/index.php acionará o último cabeçalho, enquanto visitar http://www.example.com/img/my-ducky.png acionará o cabeçalho anterior.

yuvilio
fonte
29
Observe que add_headerfuncionará apenas em solicitações bem-sucedidas . A documentação afirma que só pode ser aplicada a respostas com os códigos 200, 204, 301, 302 ou 304. Portanto, não pode ser usada para depurar erros HTTP.
John WH Smith
31
@ JohnWHSmith: Como marat observou nesta resposta . A partir da versão 1.7.5 , o nginx adicionou um parâmetro "always" ao add_headerqual retornará o cabeçalho, independentemente do código de resposta. Por exemplo, add_header X-debug-message "A php file was used" always;deve funcionar mesmo para 500 códigos de erro.
yuvilio 22/09/2015
6
Isso não responde à pergunta. O cara quer fazer logon no arquivo de log não para o cliente.
Avamander
37

Você pode retornar uma sequência simples como resposta HTTP:

location /
{
    return 200 $document_root;
}
Thomas Decaux
fonte
11
E se você quiser retornar dois valores de variáveis?
BringBackCommodore64
Ir para o local abre imediatamente a caixa de diálogo Salvar como do meu navegador (testada no Opera, Chromium). Nenhuma resposta.
BringBackCommodore64
@ BringBackCommodore64 Adicionar um cabeçalho de texto / html Content-Type pode ajudar.
bitwise
Usando o Postman , isso funciona sem nenhum cabeçalho adicional. Obrigado!
aexl 7/10
19

Você pode definir um formato de log de acesso personalizado usando a log_formatdiretiva que registra as variáveis ​​de seu interesse.

mgorven
fonte
2
obrigado, e eu acho que não há maneira mais fácil de produzir uma variável por si só?
Lulalala
@lulalala Não que eu saiba.
mgorven
É possível definir o nível de log na diretiva error_logpara debugque você possa ver o valor das variáveis ​​e do bloco que são executados. Exemploerror_log file.log debug
Victor Aguilar
11
observe que variáveis ​​vazias são mostradas como -no log, mas estão realmente vazias no código nginx, você não deve procurar -a qualquer momento. Às vezes, isso confunde os usuários.
Higuita 5/05
6

Outra opção é incluir o módulo echo ao criar o nginx ou instalar o OpenResty, que é o nginx incluído em várias extensões (como echo.)

Então você pode simplesmente polvilhar sua configuração com instruções como:

echo "args: $args"
Mark Evans
fonte
2
Quando eu tento isso, ele ecoa para um arquivo de texto sem formatação no servidor, interrompendo a saída da página real.
JaredMcAteer
Existe uma echo_logdiretiva em desenvolvimento.
Gajus