Jak wypisać zmienną w dzienniku nginx do debugowania

83

Testuję nginx i chcę wyprowadzać zmienne do plików dziennika. Jak to zrobić i jaki plik dziennika przejdzie (dostęp lub błąd).

lulalala
źródło

Odpowiedzi:

143

Możesz wysyłać wartości zmiennych nginx za pomocą nagłówków. Przydatny do rozwoju.

add_header X-uri "$uri";

a w nagłówkach odpowiedzi przeglądarki zobaczysz:

X-uri:/index.php

Czasami robię to podczas rozwoju lokalnego.

Przydaje się również do stwierdzenia, czy podsekcja jest wykonywana, czy nie. Wystarczy posypać je klauzulami, aby sprawdzić, czy się przyzwyczają.

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

Tak więc odwiedzenie adresu URL takiego jak http://www.example.com/index.php spowoduje wyzwolenie drugiego nagłówka podczas odwiedzania http://www.example.com/img/my-ducky.png spowoduje wyzwolenie poprzedniego nagłówka.

yuvilio
źródło
29
Pamiętaj, że add_headerbędzie działać tylko w przypadku pomyślnych żądań . Dokumentacja stwierdza, że ​​można go stosować tylko do odpowiedzi o kodach 200, 204, 301, 302 lub 304. Dlatego nie można go używać do debugowania błędów HTTP.
John WH Smith,
31
@JohnWHSmith: Jak zauważył marat w tej odpowiedzi . Począwszy od wersji 1.7.5 , nginx dodał parametr „zawsze”, do add_headerktórego zwróci nagłówek, bez względu na kod odpowiedzi. Na przykład add_header X-debug-message "A php file was used" always;powinien działać nawet dla kodu błędu 500.
yuvilio
6
To wcale nie odpowiada na pytanie. Facet chce się zalogować, aby zapisać plik nie w kliencie.
Avamander
37

Możesz zwrócić prosty ciąg jako odpowiedź HTTP:

location /
{
    return 200 $document_root;
}
Thomas Decaux
źródło
1
Co jeśli chcesz zwrócić dwie wartości zmiennych?
BringBackCommodore64
Przejście do lokalizacji natychmiast otwiera okno dialogowe Zapisz jako w mojej przeglądarce (testowane na Opera, Chromium). Brak odpowiedzi.
BringBackCommodore64
@ BringBackCommodore64 Dodanie nagłówka text / html Content-Type może pomóc.
bitowy
W przypadku listonosza działa to bez żadnych dodatkowych nagłówków. Dzięki!
aexl
19

Możesz ustawić niestandardowy format dziennika dostępu za pomocą log_formatdyrektywy, która rejestruje zmienne, które Cię interesują.

mgorven
źródło
2
dzięki, i myślę, że nie ma łatwiejszego sposobu na wyprowadzenie jednej zmiennej samodzielnie?
lulalala
@lulalala Nie o tym wiem.
mgorven
Możliwe jest ustawienie poziomu dziennika w dyrektywie error_logcelu debug, dzięki czemu można zobaczyć wartość zmiennych i tego bloku, które są wykonane. Przykładerror_log file.log debug
Victor Aguilar,
1
zauważ, że puste zmienne są wyświetlane jak -w dzienniku, ale tak naprawdę są puste w kodzie nginx, nie powinieneś ich sprawdzać -w żadnym momencie. To czasami myli użytkowników.
higuita
6

Inną opcją jest włączenie modułu echa podczas budowania nginx lub instalowanie OpenResty, który jest nginx w pakiecie z kilkoma rozszerzeniami (jak echo).

Następnie możesz po prostu posypać konfigurację takimi instrukcjami:

echo "args: $args"
Mark Evans
źródło
2
Kiedy próbuję tego, echo przechodzi do zwykłego pliku tekstowego na serwerze, przerywając wydruk rzeczywistej strony.
JaredMcAteer
echo_logOpracowywana jest dyrektywa.
Gajus