Comment afficher la variable dans le journal nginx pour le débogage


83

Je teste nginx et souhaite générer des variables dans les fichiers journaux. Comment puis-je faire cela et quel fichier journal ira-t-il (accès ou erreur).

Réponses:


143

Vous pouvez envoyer des valeurs de variable nginx via des en-têtes. Pratique pour le développement.

add_header X-uri "$uri";

et vous verrez dans les en-têtes de réponse de votre navigateur:

X-uri:/index.php

Je fais parfois cela pendant le développement local.

Il est également utile de vous informer si une sous-section est exécutée ou non. Il suffit de les saupoudrer dans vos clauses pour voir si elles sont utilisées.

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;
    ...
}

Donc, visiter une URL telle que http://www.example.com/index.php déclenchera ce dernier en-tête, tandis que visiter http://www.example.com/img/my-ducky.png déclenchera l'ancien en-tête.


29
Notez que add_headercela fonctionnera uniquement sur les demandes ayant abouti . La documentation indique qu'il ne peut être appliqué qu'aux réponses portant les codes 200, 204, 301, 302 ou 304. Par conséquent, il ne peut pas être utilisé pour déboguer des erreurs HTTP.
John WH Smith

31
@ JohnWHSmith: Comme Marat l'a noté dans cette réponse . À partir de la version 1.7.5 , nginx a ajouté un paramètre "Toujours" dans add_headerlequel sera renvoyé l'en-tête, quel que soit le code de réponse. Ainsi, par exemple, add_header X-debug-message "A php file was used" always;devrait fonctionner même pour 500 codes d'erreur.
Yuvilio

6
Cela ne répond pas du tout à la question. Le gars veut se connecter pour enregistrer le fichier pas sur le client.
Avamander

37

Vous pouvez renvoyer une chaîne simple sous forme de réponse HTTP:

location /
{
    return 200 $document_root;
}

1
Que faire si vous voulez renvoyer deux valeurs de variables?
BringBackCommodore64

Aller à l'emplacement ouvre immédiatement la boîte de dialogue Enregistrer sous de mon navigateur (testé sur Opera, Chromium). Aucune réponse que ce soit.
BringBackCommodore64

@ BringBackCommodore64 Ajouter un en-tête text / html Content-Type peut aider.
bitwise

Avec Postman , cela fonctionne sans en-tête supplémentaire. Merci!
aexl

19

Vous pouvez définir un format de journal d'accès personnalisé à l'aide de la log_formatdirective qui enregistre les variables qui vous intéressent.


2
merci, et je suppose qu'il n'y a pas de moyen plus facile de générer une variable par elle-même?
lulalala

@lulalala Pas que je sache.
mgorven

Il est possible de définir le niveau de journalisation dans la directive error_logafin debugque vous puissiez voir la valeur des variables et de ce bloc qui sont exécutés. Exempleerror_log file.log debug
Victor Aguilar

1
remarquez que les variables vides sont montrées comme -dans le journal, mais sont vraiment vides dans le code nginx, vous ne devriez en vérifier -à aucun moment. Cela confond parfois les utilisateurs.
higuita

6

Une autre option consiste à inclure le module echo lorsque vous compilez nginx ou à installer OpenResty, qui est livré avec un ensemble d’extensions (comme echo).

Ensuite, vous pouvez simplement saupoudrer votre configuration d’énoncés du type:

echo "args: $args"

2
Lorsque j'essaie, cela renvoie à un fichier texte brut sur le serveur, interrompant la sortie de la page réelle.
JaredMcAteer

Il y a une echo_logdirective en développement.
Gajus
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.