Question

J'utilise CakePHP 2.4.4 pour créer la partie Web interactive de mon application et cela se passe très bien.CakePHP est génial.

Je suis maintenant en train d'effectuer des processus d'arrière-plan de support.La console et le shell semblent être le moyen de le faire car ils ont accès aux modèles.

J'ai écrit le code et je le fais fonctionner, mais j'essaie d'écrire dans le même journal que celui que j'utilise pour les modèles.Dans les modèles, j'ai une fonction afterSave pour enregistrer toutes les modifications de la base de données et j'ai simplement utilisé la fonction $this->log("$model $logEntry", 'info'); pour écrire dans le journal.

Cela ne fonctionne pas dans le Shell mais je pensais que le CakeLog::write('info', "$model $logEntry"); cela pourrait fonctionner, mais ce n'est pas le cas non plus.

Dois-je initialiser le CakeLog pour pointer vers les bons fichiers journaux ?

<?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);
        }
    }
}
?>
Était-ce utile?

La solution

Avez-vous configuré un écouteur/portée par défaut pour ces types de journaux ?Sinon, ils ne seront pas connectés.

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

Dans votre bootstrap.php par exemple

Voir http://book.cakephp.org/2.0/en/appendices/2-2-migration-guide.html#log

Autres conseils

Vous devez configurer default flux de journaux écrivant dans un fichier, éventuellement, dans app/Config/bootstrap.php.

CakeLog ne se configure plus automatiquement.En conséquence, les fichiers journaux ne seront plus créés automatiquement si aucun flux n'écoute.Assurez-vous que vous en avez au moins un default Configuration du flux, si vous souhaitez écouter tous les types et niveaux.Habituellement, vous pouvez simplement définir le noyau FileLog classe pour sortir dans app/tmp/logs/:

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

Voir Journalisation → Écriture dans les journaux section du CookBook 2.x

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top