You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除GAE PHP7.4标准环境日志中child said into stdout/stderr前缀

GAE PHP7.4标准环境移除fpm日志前缀方案

方案背景

GAE PHP7.4标准环境默认使用php-fpm运行时,且不允许修改catch_workers_output运行时配置,日志输出到php://stdout/php://stderr时会自动添加child X said into stdout/stderr前缀,以下两个方案均仅通过修改php.ini和业务代码实现,不需要调整运行时配置。

方案1:自定义日志处理器(兼容原有日志写入逻辑)

  • 步骤1:在项目根目录创建php.ini,添加如下配置:
; 关闭PHP默认错误输出逻辑
log_errors = Off
; 自动加载自定义日志处理脚本,路径对应你项目中脚本的实际路径
auto_prepend_file = /workspace/log_handler.php
  • 步骤2:创建log_handler.php自定义日志处理脚本:
<?php
// 接管PHP错误输出
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
    $log = sprintf(
        "[%s] ERROR %d: %s %s:%d\n",
        date('Y-m-d H:i:s'),
        $errno,
        $errstr,
        $errfile,
        $errline
    );
    fwrite(STDERR, $log);
    return true;
});

// 接管未捕获异常输出
set_exception_handler(function ($e) {
    $log = sprintf(
        "[%s] EXCEPTION: %s %s:%d\nStack trace:\n%s\n",
        date('Y-m-d H:i:s'),
        $e->getMessage(),
        $e->getFile(),
        $e->getLine(),
        $e->getTraceAsString()
    );
    fwrite(STDERR, $log);
});

// 注册自定义流包装器,拦截原有php://stdout/stderr写入逻辑
class CustomStdioWrapper {
    public $position = 0;
    private $stream;

    public function stream_open($path, $mode, $options, &$opened_path) {
        $this->stream = $path === 'php://stdout' ? STDOUT : STDERR;
        return true;
    }

    public function stream_write($data) {
        return fwrite($this->stream, $data);
    }

    // 实现其他流方法适配业务调用
    public function stream_eof() {
        return feof($this->stream);
    }

    public function stream_stat() {
        return fstat($this->stream);
    }
}

// 先取消原有php协议的注册,再注册自定义包装器
stream_wrapper_unregister('php');
stream_wrapper_register('php', 'CustomStdioWrapper');

该方案无需修改原有业务中写php://stdout的代码,即可自动移除fpm添加的前缀。

方案2:通过syslog输出(改造成本最低)

php-fpm不会对syslog的输出内容添加前缀,且GAE标准环境会自动采集syslog日志上报到Cloud Logging。

  • 步骤1:在php.ini中添加配置:
; 将PHP默认错误日志输出到syslog
error_log = syslog
; 可选配置:设置syslog标识,方便后续筛选日志
syslog.ident = your_app_name
  • 步骤2:业务日志调用syslog函数输出:
// 输出普通信息日志
syslog(LOG_INFO, "业务日志内容");
// 输出警告日志
syslog(LOG_WARNING, "警告内容");
// 输出错误日志
syslog(LOG_ERR, "错误内容");

PHP内置的所有报错、警告也会自动输出到syslog,无多余前缀。

内容的提问来源于stack exchange,提问作者Voriki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:09:01