So geben Sie eine Variable im nginx-Protokoll zum Debuggen aus

83

Ich teste Nginx und möchte Variablen in die Protokolldateien ausgeben. Wie kann ich das machen und welche Logdatei wird es gehen (Zugriff oder Fehler).

lulalala
quelle

Antworten:

143

Sie können Nginx-Variablenwerte über Header senden. Handlich für die Entwicklung.

add_header X-uri "$uri";

und Sie werden in den Antwortköpfen Ihres Browsers sehen:

X-uri:/index.php

Ich mache das manchmal während der lokalen Entwicklung.

Es ist auch praktisch, um Ihnen mitzuteilen, ob ein Unterabschnitt ausgeführt wird oder nicht. Streuen Sie es einfach in Ihre Klauseln, um zu sehen, ob sie sich daran gewöhnen.

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

Wenn Sie also eine URL wie http://www.example.com/index.php besuchen, wird der letztgenannte Header ausgelöst, während Sie http://www.example.com/img/my-ducky.png besuchen, wird der erstgenannte Header ausgelöst.

yuvilio
quelle
29
Beachten Sie, dass nur erfolgreiche Anfragenadd_header bearbeitet werden können . Die Dokumentation besagt, dass es nur auf Antworten mit den Codes 200, 204, 301, 302 oder 304 angewendet werden kann. Daher kann es nicht zum Debuggen von HTTP-Fehlern verwendet werden.
John WH Smith
31
@ JohnWHSmith: Wie Marat in dieser Antwort vermerkt . Ab Version 1.7.5 hat nginx einen "always" -Parameter hinzugefügt , add_headerder den Header unabhängig vom Antwortcode zurückgibt. So sollte zum Beispiel add_header X-debug-message "A php file was used" always;auch der 500er Fehlercode funktionieren.
Yuvilio
6
Dies beantwortet die Frage überhaupt nicht. Der Typ möchte sich anmelden, um die Datei nicht beim Client anzumelden .
Avamander
37

Sie können eine einfache Zeichenfolge als HTTP-Antwort zurückgeben:

location /
{
    return 200 $document_root;
}
Thomas Decaux
quelle
1
Was ist, wenn Sie zwei Variablenwerte zurückgeben möchten?
BringBackCommodore64
Wenn Sie zum Speicherort wechseln, wird sofort das Dialogfeld "Speichern unter" meines Browsers geöffnet (getestet auf Opera, Chromium). Keine Antwort.
BringBackCommodore64
@ BringBackCommodore64 Das Hinzufügen eines Content-Type-Headers für Text / HTML kann hilfreich sein.
Bitweise
Bei Verwendung von Postman funktioniert dies ohne zusätzliche Header. Vielen Dank!
Aexl
19

Sie können mithilfe der log_formatDirektive ein benutzerdefiniertes Zugriffsprotokollformat festlegen, das die Variablen protokolliert, an denen Sie interessiert sind.

mgorven
quelle
2
Danke, und ich denke, es gibt keinen einfacheren Weg, eine Variable für sich selbst auszugeben?
Lulalala
@ lulalala Nicht, dass ich wüsste.
mgorven
Es ist möglich, die Protokollebene in der Direktive so einzustellen error_log, debugdass Sie den Wert der Variablen und des ausgeführten Blocks sehen können. Beispielerror_log file.log debug
Victor Aguilar
1
Beachten Sie, dass leere Variablen wie -im Protokoll angezeigt werden , aber im Nginx-Code wirklich leer sind. Dies sollten Sie -zu keinem Zeitpunkt überprüfen . Dies verwirrt manchmal Benutzer.
Higuita
6

Eine andere Möglichkeit ist, das Echo-Modul beim Erstellen von Nginx einzuschließen oder OpenResty zu installieren, das Nginx mit einer Reihe von Erweiterungen (wie Echo) enthält.

Dann können Sie Ihre Konfiguration einfach mit Aussagen wie:

echo "args: $args"
Mark Evans
quelle
2
Wenn ich das versuche, wird es in eine reine Textdatei auf dem Server ausgegeben, die die Ausgabe der eigentlichen Seite unterbricht.
JaredMcAteer
Es gibt eine echo_logRichtlinie in der Entwicklung.
Gajus