它log_format
可以包含一系列变量,例如 $http_user_agent:
http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
但是是否可以包含来自 PHP-FPM 的变量?
例如,我想在中包含用户 ID 和时间信息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。
答案1
当使用 PHP-FPM 时,您只能发送标头,然后发送内容。
所以我现在使用一个单独的日志文件,一个由 PHP 创建的日志文件,并且可以随时写入 - 即使在发送标题和内容之后。
这在使用时尤其有用fastcgi_finish_request()
,它允许您向用户返回一个页面(可能是“加载”页面),因为您的脚本会继续处理数据。
为了将 Web 服务器访问日志与这个新的日志文件链接起来,我为每个请求生成一个唯一的代码,将其作为标题发送(记录在 Web 服务器访问日志中),并将其记录在 PHP 日志文件中。