AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 627055
Accepted
Craig Francis
Craig Francis
Asked: 2014-09-09 08:43:01 +0800 CST2014-09-09 08:43:01 +0800 CST 2014-09-09 08:43:01 +0800 CST

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

  • 772

可以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。

nginx
  • 1 1 个回答
  • 1843 Views

1 个回答

  • Voted
  1. Best Answer
    Craig Francis
    2019-12-25T08:12:43+08:002019-12-25T08:12:43+08:00

    使用 PHP-FPM 时,您只能发送标头,然后是内容。

    所以我现在使用一个单独的日志文件,它是从 PHP 创建的,并且可以随时写入 - 即使在发送了标题和内容之后。

    这在使用 时特别有用fastcgi_finish_request(),它允许您将页面返回给用户(可能是“加载”页面),因为您的脚本会继续处理数据。

    为了将 Web 服务器访问日志与这个新的日志文件链接起来,我为每个请求生成一个唯一的(ish)代码,将其作为标头发送(记录在 Web 服务器访问日志中),并将其记录在 PHP 日志文件中也是。

    有关 Apache 版本的更多信息。

    • 0

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve