可以log_format
包含一系列变量,例如 $http_user_agent:
http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
但是是否可以包含 PHP-FPM 中的变量?
例如,我想在access_log
.
一种可能性是在 PHP 中设置一个标头,然后使用 $sent_http_XXX:
log_format inc_info '... [$sent_http_x_user_id] ...';
access_log /var/log/nginx/access.log inc_info;
<?php
header('X-User-ID: ' . head(USER_ID));
?>
您可能应该在哪里proxy_hide_header
停止将这些标头发送到客户端。
但是,如果标头已经发送,这种基于标头的方法将不起作用。例如,我register_shutdown_function()
在 PHP 中使用来记录处理时间。
顺便说一句,如果您只是想要处理时间,那么 $upstream_response_time 可能会有用。
相比之下,这可以通过以下方式在 Apache 中完成:
LogFormat "... [%{USER_ID}n] ..." inc_info
CustomLog /var/log/httpd/access_log inc_info
使用相应的 PHP:
if (function_exists('apache_note')) {
apache_note('USER_ID', USER_ID);
}
虽然apache_note()
仅在 mod_php 中可用,并且不适用于 PHP-FPM。
使用 PHP-FPM 时,您只能发送标头,然后是内容。
所以我现在使用一个单独的日志文件,它是从 PHP 创建的,并且可以随时写入 - 即使在发送了标题和内容之后。
这在使用 时特别有用
fastcgi_finish_request()
,它允许您将页面返回给用户(可能是“加载”页面),因为您的脚本会继续处理数据。为了将 Web 服务器访问日志与这个新的日志文件链接起来,我为每个请求生成一个唯一的(ish)代码,将其作为标头发送(记录在 Web 服务器访问日志中),并将其记录在 PHP 日志文件中也是。
有关 Apache 版本的更多信息。