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

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.


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

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


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"

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.