Пользовательское сообщение CakePhp ConsoleLog - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь получить пользовательские журналы консоли, чтобы вместо

2019-07-10 03:15:31 Error: [ParseError] syntax error, unexpected '}'
#0 /app/app/vendor/composer/ClassLoader.php(322): Composer\Autoload\includeFile('/app/app/vendor...')
#1 [internal function]: Composer\Autoload\ClassLoader->loadClass('App\\Controller\\...')

Я хочу это в формате json

{"Error":"[ParseError] syntax error, unexpected '}'"}

В настоящее время я создал специальный адаптер журнала

// Log/Engine/ApplicationLog.php

    class ApplicationLog extends BaseLog
        {
        public $Logs;

        public function __construct($options = [])
        {       parent::__construct($options);

            // ...
        }

        public function log($level, $message, array $context = [])
        {
    //        $level = $this->getConfig('type');
            $this->$message = 'Test'.$message;
        }
        public function error($message, array $context = [])
        {
    //        return static::write(__FUNCTION__, '{"error":"'.$message.'"}', $context);
            return write('TESTESTSTESTSTEST');

        }
    }

с конфигом как

// bootstrap.php
Log::setConfig('application', [
    'className' => 'Application',
    'path' => LOGS,
    'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
    'file' => 'error',
    'engine' => 'console',
]);

Я пытаюсь переопределить методы ошибки BaseLog, чтобы изменить сообщение в соответствии с моими требованиями, но оно не вызывает мое пользовательское сообщение [после удаления параметра engine из setConfig оно вызывало мою функцию]. Любые предложения приветствуются и спасибо.

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Вы не можете использовать опцию engine и опцию className, первая перезапишет последнюю.Опция engine является реликтом из CakePHP 1.x / 2.x, и я понятия не имею, почему он все еще существует.

0 голосов
/ 11 июля 2019

Вот так у меня все получилось

// bootstrap.php
Log::setConfig('application', [
    'className' => 'Application',
    'path' => LOGS,
    'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
    'file' => 'error'
]);

удалил параметр двигателя, поскольку он мешал функциям класса

// Log/Engine/ApplicationLog.php
class ApplicationLog extends BaseLog
{
    protected $_defaultConfig = [
        'stream' => 'php://stderr',// similar to ConsoleLog
        'levels' => null,
        'scopes' => [],
        'outputAs' => null,
    ];


    protected $_output;

    public function __construct($config = [])
    {       parent::__construct($config);
        $config = $this->_config;
        if ($config['stream'] instanceof ConsoleOutput) {
            $this->_output = $config['stream'];
        } elseif (is_string($config['stream'])) {
            $this->_output = new ConsoleOutput($config['stream']);
        } else {
            throw new InvalidArgumentException('`stream` not a ConsoleOutput nor string');
        }

        if (isset($config['outputAs'])) {
            $this->_output->setOutputAs($config['outputAs']);
        }
    }

    public function log($level, $message, array $context = [])
    {
        $message = preg_replace("/[\r\n]+/", " ", '{"'.$level.'":"'.$message.'"}');
        $message = $this->_format($message, $context);

       //$output = date('Y-m-d H:i:s') . ' ' . ucfirst($level) . ': ' . $message;
       //return (bool)$this->_output->write(sprintf('<%s>%s</%s>', $level, $output, $level));

        return (bool)$this->_output->write(sprintf('<%s>%s</%s>', $level, $message, $level));

    }
}
...