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

lul*_*ala 123 nginx

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

yuv*_*lio 200

您可以通过标头发送 nginx 变量值。方便开发。

add_header X-uri "$uri";
Run Code Online (Sandbox Code Playgroud)

你会在浏览器的响应头中看到:

X-uri:/index.php
Run Code Online (Sandbox Code Playgroud)

我有时会在本地开发期间这样做。

告诉您一个小节是否正在执行也很方便。只需将它洒在您的条款中,看看它们是否被使用。

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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

因此,访问像http://www.example.com/index.php这样的 url将触发后一个标头,而访问http://www.example.com/img/my-ducky.png将触发前一个标头。

  • @JohnWHSmith:正如马拉在[这个答案](http://serverfault.com/questions/418709/nginx-add-header-for-a-50-page/647552#647552)中指出的那样。从 [version 1.7.5](http://nginx.org/en/CHANGES) 开始,nginx 添加了 ["always" 参数](http://nginx.org/en/docs/http/ngx_http_headers_module.html)到 ```add_header``` 这将返回标头,无论响应代码是什么。因此,例如,```add_header X-debug-message "A php file was used" always;```,即使对于 500 错误代码也应该有效。 (41认同)
  • 请注意,`add_header` 将[仅对成功请求](http://wiki.nginx.org/NginxHttpHeadersModule#add_header) 起作用。文档说明它只能应用于代码为 200、204、301、302 或 304 的响应。因此,它不能用于调试 HTTP 错误。 (35认同)
  • 这根本没有回答这个问题。这家伙想登录**日志文件**而不是客户端。 (12认同)

Tho*_*aux 53

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

location /
{
    return 200 $document_root;
}
Run Code Online (Sandbox Code Playgroud)

请注意,.html如果您不想更改页面的标题,则必须访问以 结尾的页面。

  • 如果你想返回两个变量值怎么办? (2认同)
  • 我想返回多个变量并像这样解决它;`return 200 "xforwardedfor:$proxy_add_x_forwarded_for--remote_addr:$remote_addr--scheme:$scheme--host:$host"; ` (2认同)

mgo*_*ven 21

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

  • 谢谢,我想没有更简单的方法可以单独输出一个变量吗? (2认同)
  • 注意空变量在日志中显示为`-`,但在nginx代码中确实是空的,你不应该在任何时候检查`-`。这有时会使用户感到困惑。 (2认同)

小智 8

另一种选择是在构建 nginx 时包含echo 模块,或者安装OpenResty,它是 nginx 捆绑了一堆扩展(如 echo)。

然后,您可以简单地使用以下语句散布您的配置:

echo "args: $args"
Run Code Online (Sandbox Code Playgroud)

  • 当我尝试这个时,它会回显到服务器上的纯文本文件,中断实际页面的输出。 (2认同)

小智 5

这些都没有回答所提出的问题(日志)

然而,@Victor Aguilar - 对此答案有评论,这应该是一个答案!它说明了如何记录变量,并且它有效。谢谢!

https://serverfault.com/a/404628/400075

即在/etc/nginx/nginx.conf

error_log /var/log/nginx/error.log debug;

导致以下类型的日志记录:

2021/03/06 15:14:48 [debug] 2550#2550: *1 fastcgi param: "SCRIPT_FILENAME: /usr/lib/cgit/cgit.cgi/something.git/cgit.cgi"
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script copy: "QUERY_STRING"
2021/03/06 15:14:48 [debug] 2550#2550: *1 fastcgi param: "QUERY_STRING: "
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script copy: "REQUEST_METHOD"
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script var: "GET"
2021/03/06 15:14:48 [debug] 2550#2550: *1 fastcgi param: "REQUEST_METHOD: GET"
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script copy: "CONTENT_TYPE"
2021/03/06 15:14:48 [debug] 2550#2550: *1 fastcgi param: "CONTENT_TYPE: "
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script copy: "CONTENT_LENGTH"
2021/03/06 15:14:48 [debug] 2550#2550: *1 fastcgi param: "CONTENT_LENGTH: "
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script copy: "SCRIPT_NAME"
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script var: "/cgit/cgit.cgi/something.git/cgit.cgi"
2021/03/06 15:14:48 [debug] 2550#2550: *1 fastcgi param: "SCRIPT_NAME: /cgit/cgit.cgi/something.git/cgit.
cgi"
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script copy: "REQUEST_URI"
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script var: "/cgit/cgit.cgi/something.git/"
2021/03/06 15:14:48 [debug] 2550#2550: *1 fastcgi param: "REQUEST_URI: /cgit/cgit.cgi/something.git/"
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script copy: "DOCUMENT_URI"
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script var: "/cgit/cgit.cgi/something.git/"
2021/03/06 15:14:48 [debug] 2550#2550: *1 fastcgi param: "DOCUMENT_URI: /cgit/cgit.cgi/something.git/"
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script copy: "DOCUMENT_ROOT"
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script var: "/usr/lib"
2021/03/06 15:14:48 [debug] 2550#2550: *1 fastcgi param: "DOCUMENT_ROOT: /usr/lib"
2021/03/06 15:14:48 [debug] 2550#2550: *1 http script copy: "SERVER_PROTOCOL"
2021/03/06 15:14:48 [debug] 2550#2550: *....

Run Code Online (Sandbox Code Playgroud)

  • 并非所有 nginx 包都带有 --with-debug 标志,因此如果 nginx 是用 --with-debug 构建的,那么 debug 指令在 error_log 中是无用的(我看到大多数 nginx 都是在没有构建的情况下构建的) (3认同)