如何在Nginx日志中输出变量以进行调试


83

我正在测试nginx,并希望将变量输出到日志文件。我该怎么办,它将去哪个日志文件(访问或错误)。

Answers:


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

因此,访问http://www.example.com/index.php之类的网址将触发后一个标头,而访问http://www.example.com/img/my-ducky.png则将触发前一个标头。


29
请注意,这add_header适用于成功的请求。文档指出,它只能应用于代码为200、204、301、302或304的响应。因此,它不能用于调试HTTP错误。
约翰·史密斯

31
@JohnWHSmith:正如马拉特在这个答案中指出的那样。从1.7.5版开始,nginx添加了一个“ always”参数add_header,无论响应代码如何,nginx都将向其返回标头。因此,例如,add_header X-debug-message "A php file was used" always;即使对于500个错误代码也应起作用。
yuvilio

6
这根本无法回答问题。那家伙想登录以将文件记录到客户端。
Avamander '18

37

您可以返回一个简单的字符串作为HTTP响应:

location /
{
    return 200 $document_root;
}

1
如果要返回两个变量值怎么办?
BringBackCommodore64

转到该位置将立即打开浏览器的“另存为”对话框(在Opera,Chromium上进行了测试)。没有任何回应。
BringBackCommodore64

@ BringBackCommodore64添加文本/ html Content-Type标头可能会有所帮助。
按位

使用Postman时,无需任何其他标题即可使用。谢谢!
aexl

19

您可以使用log_format伪指令设置自定义访问日志格式,该伪指令记录您感兴趣的变量。


2
谢谢,我想没有简单的方法可以自行输出一个变量了吗?
lulalala 2012年

@lulalala我不知道。
mgorven

可以将指令中的日志级别设置为error_logdebug以便您可以看到变量的值以及正在执行的块。示例error_log file.log debug
Victor Aguilar'1

1
请注意,空变量如-日志中所示,但在nginx代码中确实为空,您不应-随时检查。这有时会使用户感到困惑。
higuita

6

另一种选择是在构建nginx或安装nginx捆绑有大量扩展(例如echo)的OpenResty时包括echo模块

然后,您可以简单地在配置中添加如下语句:

echo "args: $args"

2
当我尝试此操作时,它会回显到服务器上的纯文本文件,从而中断实际页面的输出。
JaredMcAteer

开发中存在echo_log指令。
Gajus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.