从控制台Shell写入日志

时间:2014-02-26 05:25:58

标签: shell cakephp cakephp-2.4

我一直在使用CakePHP 2.4.4来构建我的应用程序的交互式Web部分,这非常顺利。 CakePHP太棒了。

我现在正在做一些支持后台流程。 Console和Shell似乎是可以访问模型的方式。

我已编写代码并使其正常工作,但我正在尝试写入我用于模型的相同日志。在模型中,我有一个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);
        }
    }
}
?>

2 个答案:

答案 0 :(得分:0)

您是否为这些日志类型设置了默认侦听器/范围? 如果没有,他们将不会被记录。

// 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

答案 1 :(得分:0)

您需要在default中设置app/Config/bootstrap.php日志流写入文件。

  

CakeLog 不再自动配置。结果是日志文件   如果没有流正在侦听,则不会再自动创建。确保   如果你想听,你至少设置了一个default流   所有类型和级别。通常,您只需设置核心FileLog类   输出到app/tmp/logs/

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

参见CookBook 2.x的Logging → Writing to logs部分