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).

lulalala
la source

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.

Yuvilio
la source
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;
}
Thomas Decaux
la source
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.

mgorven
la source
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"
Mark Evans
la source
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