Вопрос

Я использую CakePHP 2.4.4 для создания интерактивной веб-части своего приложения, и дела идут очень хорошо.CakePHP — это круто.

Сейчас я выполняю некоторые поддерживающие фоновые процессы.Консоль и оболочка, похоже, подходят для этого, поскольку у них есть доступ к моделям.

Я написал код, и он работает, но я пытаюсь записать его в тот же журнал, который использую для моделей.В моделях у меня есть функция afterSave для регистрации всех изменений базы данных, и я просто использовал функцию $this->log("$model $logEntry", 'info'); записать в журнал.

Это не работает в Shell, но я думал, что CakeLog::write('info', "$model $logEntry"); может сработать, но это тоже не так.

Нужно ли мне инициализировать CakeLog, чтобы он указывал на правильные файлы журналов?

<?php
App::uses('CakeTime', 'Utility');
App::uses('CakeLog', 'Utility');

class ProcessRequestShell extends AppShell {
    //Need to access the request and monitor tables
    public $uses = array('Request');

    private function updateRequest($data){
        $model = 'Request';
        $result = $this->Request->save($data);

        $logEntry = "UPDATE ProcessRequestShell ";
        foreach ($data[$model] AS $k => $v){$logEntry .= "$k='$v' ";}
        if ($result){
            //$this->log("$model $logEntry", 'info');
            CakeLog::write('info', "$model $logEntry");
        } else {
            //$this->log("$model FAILED $logEntry", 'error');
            CakeLog::write('error', "$model FAILED $logEntry");
        }
        return($result);
    }

    public function main() {
        $options = array('conditions' => array('state' => 0, 'next_state' => 1));
        $this->Request->recursive = 0;
        $requests = $this->Request->find('all', $options);

        //See if the apply_changes_on date/time is past
        foreach ($requests AS $request){
            $this->out("Updating request ".$request['Request']['id'], 1, Shell::NORMAL);

            //Update the next_state to "ready"
            $request['Request']['state'] = 1;
            $request['Request']['next_state'] = 2;
            $this->updateRequest($request);
        }
    }
}
?>
Это было полезно?

Решение

Настроили ли вы прослушиватель/область по умолчанию для этих типов журналов?В противном случае они не будут зарегистрированы.

// Setup a 'default' cache configuration for use in the application.
Cache::config('default', array('engine' => 'File'));

Например, в вашем bootstrap.php

Видеть http://book.cakephp.org/2.0/en/appendices/2-2-migration-guide.html#log

Другие советы

Вам необходимо настроить default запись потока журнала в файл, в конечном итоге, в app/Config/bootstrap.php.

CakeLog больше не настраивается автоматически.В результате файлов журнала больше не будут автоматически создаваться, если поток не слушает.Убедитесь, что у вас есть хотя бы один default Настройка потока, если вы хотите прослушать все типы и уровни.Обычно вы можете просто установить ядро FileLog класс для вывода в app/tmp/logs/:

CakeLog::config('default', array(
    'engine' => 'File'
));

Видеть Ведение журнала → Запись в логи раздел CookBook 2.x

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top