如何移除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
相关产品推荐
相关产品推荐

