Écriture de journaux à partir du shell de la console
-
21-12-2019 - |
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);
}
}
}
?>
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 undefault
Configuration du flux, si vous souhaitez écouter tous les types et niveaux.Habituellement, vous pouvez simplement définir le noyauFileLog
classe pour sortir dansapp/tmp/logs/
:CakeLog::config('default', array( 'engine' => 'File' ));
Voir Journalisation → Écriture dans les journaux section du CookBook 2.x