CakePHP:如果至少发生1个错误,则通过电子邮件发送日志输出

CakePHP:如果至少发生1个错误,则通过电子邮件发送日志输出,cakephp,Cakephp,我有一个基于CakePHP3.6的控制台应用程序。一旦日志记录包含至少一个错误或警告,它就会自动发送电子邮件。有专门为此制作的记录器吗?由于我没有找到任何记录器,我创建了一个自定义记录器,将日志条目保存在类变量中: <?php namespace App\Log\Engine; use Psr\Log\LogLevel; use Cake\Log\Engine\BaseLog; class BufferLog extends BaseLog { protected static

我有一个基于CakePHP3.6的控制台应用程序。一旦日志记录包含至少一个错误或警告,它就会自动发送电子邮件。有专门为此制作的记录器吗?

由于我没有找到任何记录器,我创建了一个自定义记录器,将日志条目保存在类变量中:

<?php
namespace App\Log\Engine;
use Psr\Log\LogLevel;

use Cake\Log\Engine\BaseLog;

class BufferLog extends BaseLog
{
    protected static $buffer = '';

    protected static $needsSending = false;

    public static function getBuffer() {
        if (self::$needsSending)
            return self::$buffer;
        return '';
    }

    public static function reset() {
            self::$buffer = false;
            self::$needsSending = false;
    }

    public function log($level, $message, array $context = [])
    {
        $alert = [
            LogLevel::EMERGENCY,
            LogLevel::CRITICAL,
            LogLevel::ALERT,
            LogLevel::ERROR,
            LogLevel::WARNING,
        ];
        if (in_array($level, $alert)) {
            self::$needsSending = true;
        }

        $message = $this->_format($message);

        unset($context['scope']);
        if ($context) {
            $message .= "\n" . $this->_format($context) . "\n";
        }

        self::$buffer .=  date('c') . ' [' . $level . '] ' . $message . "\n";
    }
}

(请注意,这只适用于日志文件中的错误,而不适用于PHP错误。)

如果要记录PHP错误,有一个插件:

$logOutput = BufferLog::getBuffer();
if ($logOutput) {
    Email::deliver('you@example.com', 'Log', $logOutput, ['from' => 'me@example.com']);
}