从 PHP-FPM 向 nginx 访问日志添加自定义变量

从 PHP-FPM 向 nginx 访问日志添加自定义变量

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 日志文件中。

有关 Apache 版本的更多信息

相关内容