CodeIgniter 4如何将所有日志文件内容输出到标准输出(stdout)?
CodeIgniter 4 输出全部日志到stdout的实现方法
存在两种成熟的实现方案,具体操作如下:
方案1:通过内置配置快速实现
无需编写额外代码,直接修改框架日志配置文件即可:
- 打开配置文件
app/Config/Logger.php - 修改
$handlers属性,新增stdout输出的处理器配置:
public $handlers = [ // 可保留原有FileHandler配置实现同时写文件+输出stdout,不需要文件日志可删除 'file' => [ 'className' => CodeIgniter\Log\Handlers\FileHandler::class, 'handles' => ['emergency', 'alert', 'critical', 'error', 'warning', 'notice', 'info', 'debug'], 'path' => WRITEPATH . 'logs/', 'permission'=> 0644, ], // 新增stdout输出配置 'stdout' => [ 'className' => CodeIgniter\Log\Handlers\ErrorLogHandler::class, 'handles' => ['emergency', 'alert', 'critical', 'error', 'warning', 'notice', 'info', 'debug'], 'messageType' => 'php://stdout', ] ];
方案2:自定义日志处理器(灵活性更高)
如果需要自定义日志输出格式、添加额外字段,推荐使用自定义处理器:
- 新建自定义处理器文件
app/Libraries/Log/StdoutHandler.php,内容如下:
<?php namespace App\Libraries\Log; use CodeIgniter\Log\Handlers\BaseHandler; class StdoutHandler extends BaseHandler { protected $stdoutStream; public function __construct(array $config) { parent::__construct($config); // 打开stdout流 $this->stdoutStream = fopen('php://stdout', 'wb'); } /** * 处理日志写入 */ public function handle($level, $message, array $context = []): bool { $formattedLog = $this->formatLog($level, $message, $context); fwrite($this->stdoutStream, $formattedLog . PHP_EOL); return true; } /** * 自定义日志格式,可根据需求修改 */ protected function formatLog(string $level, string $message, array $context = []): string { $date = date('Y-m-d H:i:s'); return "[{$date}] [{$level}] " . trim($message); } /** * 销毁时关闭流 */ public function __destruct() { is_resource($this->stdoutStream) && fclose($this->stdoutStream); } }
- 回到
app/Config/Logger.php,修改$handlers配置引入自定义处理器:
public $handlers = [ 'stdout' => [ 'className' => \App\Libraries\Log\StdoutHandler::class, 'handles' => ['emergency', 'alert', 'critical', 'error', 'warning', 'notice', 'info', 'debug'], ] ];
注意事项
- 若部署在Docker等容器环境,建议删除原有的FileHandler配置,避免容器内磁盘占用过高。
- 可通过调整
handles数组的元素,筛选需要输出到stdout的日志级别。
内容的提问来源于stack exchange,提问作者dgggggggğ
相关产品推荐
相关产品推荐

