php-fpm 访问日志应该包含来自 php 应用程序设置的自定义变量

Pre

当前的设置是使用 Apache+mod_php 进行的。我们能够通过使用 apache_setenv 在代码中设置 userId 和 sessionId 并将其放在 Apache 访问日志中:

"\"%{USER_ID}e\" \"%{SESSION_ID}e\""

这对我们根据访问日志轻松调试信息是必要的。

Feature

考虑以下设置:运行在 php-fpm 上有 nginx 作为反向代理的 php 应用程序。

我想要转移到使用 php-fpm 和 nginx 的容器应用程序。但问题是,我无法使用 $_ENV 将动态变量记录到 nginx 或 php-fpm 日志中。数据存在于 $_SERVER 的转储中,但无法从 php-fpmnginx-access 日志中访问。

Question

  1. 如果我能够从应用程序中使用环境变量将 fastcgi_param 设置在 nginx 中,那么情况就结束了。在 nginx 中使用 os.getenvvariable 的 lua 应该能做到这一点吗?
  2. 在 php-fpm 访问日志格式中,尽管它们存在于 var_dump($_SERVER) 中,但 %{userId}e%{sessionId}e 不会被识别。如果我从 nginx 传递带有静态值的 fastcgi_param,我就可以在 php-fpm 中访问这样的环境变量。

还有其他选项可以做到这一点吗?目前我正在尝试。

点赞
用户108654
用户108654

我的解决方案是使用自定义的 HTTP 头部:

header("UserId: 1");
header("SessionId: session_id");

然后在 nginx 访问日志中使用:

log_format main "$upstream_http_userid $upstream_http_sessionid";

如果是 Apache 访问日志,则使用如下格式:

LogFormat "%h %l %u %t \"%r\" %>s %O %{UserId}o %{SessionId}o"
2019-05-09 15:01:56