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

CodeIgniter 4如何将所有日志文件内容输出到标准输出(stdout)?

CodeIgniter 4 输出全部日志到stdout的实现方法

存在两种成熟的实现方案,具体操作如下:

方案1:通过内置配置快速实现

无需编写额外代码,直接修改框架日志配置文件即可:

  1. 打开配置文件 app/Config/Logger.php
  2. 修改$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:自定义日志处理器(灵活性更高)

如果需要自定义日志输出格式、添加额外字段,推荐使用自定义处理器:

  1. 新建自定义处理器文件 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);
    }
}
  1. 回到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ğ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:09:03