Как вывести переменную в журнал nginx для отладки

83

Я тестирую nginx и хочу выводить переменные в файлы журнала. Как я могу это сделать и какой файл журнала он будет идти (доступ или ошибка).

lulalala
источник

Ответы:

143

Вы можете отправлять значения переменных nginx через заголовки. Удобно для разработки.

add_header X-uri "$uri";

и вы увидите в заголовках ответа вашего браузера:

X-uri:/index.php

Я иногда делаю это во время местного развития.

Это также удобно, чтобы сообщить вам, выполняется ли подраздел или нет. Просто опрысните это в своих предложениях, чтобы видеть, привыкают ли они.

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

Таким образом, посещение URL-адреса, например http://www.example.com/index.php , вызовет последний заголовок, а посещение http://www.example.com/img/my-ducky.png вызовет предыдущий заголовок.

yuvilio
источник
29
Обратите внимание, что add_headerбудет работать только на успешных запросов . В документации говорится, что его можно применять только к ответам с кодами 200, 204, 301, 302 или 304. Поэтому его нельзя использовать для отладки ошибок HTTP.
Джон У. С. Смит
31
@JohnWHSmith: Как отметил Марат в этом ответе . Начиная с версии 1.7.5 , nginx добавил параметр «всегда», к add_headerкоторому будет возвращаться заголовок независимо от кода ответа. Так, например, add_header X-debug-message "A php file was used" always;должен работать даже код ошибки 500.
Ювилио
6
Это не отвечает на вопрос вообще. Парень хочет войти в лог-файл не для клиента.
Avamander
37

Вы можете вернуть простую строку в качестве ответа HTTP:

location /
{
    return 200 $document_root;
}
Томас Деко
источник
1
Что если вы хотите вернуть значения двух переменных?
BringBackCommodore64
Переход к этому местоположению немедленно открывает диалоговое окно «Сохранить как» моего браузера (проверено на Opera, Chromium). Никакого ответа вообще.
BringBackCommodore64
@ BringBackCommodore64 Может помочь добавление текстового / html-заголовка Content-Type.
поразрядно
Используя Почтальон , это работает без каких-либо дополнительных заголовков. Спасибо!
aexl
19

Вы можете установить пользовательский формат журнала доступа, используя log_formatдирективу, которая регистрирует интересующие вас переменные.

mgorven
источник
2
спасибо, и я думаю, что нет более простого способа вывести одну переменную сама по себе?
Лулалала
@ lulalala Не то, что я знаю.
Mgorven
Можно установить уровень журнала в директиве error_logк debugтак что вы можете увидеть значение переменных , и что блок, которые выполняются. Примерerror_log file.log debug
Виктор Агилар
1
Обратите внимание, что пустые переменные отображаются как -в журнале, но действительно пусты в коде nginx, вы не должны проверять их -в любое время. Это иногда смущает пользователей.
Higuita
6

Другой вариант - включить модуль echo при сборке nginx или установить OpenResty, который является nginx в комплекте с набором расширений (например, echo.)

Тогда вы можете просто посыпать свою конфигурацию такими утверждениями, как:

echo "args: $args"
Марк Эванс
источник
2
Когда я пытаюсь это сделать, он выводит текстовый файл на сервер, прерывая вывод фактической страницы.
JaredMcAteer
В разработке есть echo_logдиректива.
Gajus