Schreiben von Protokollen aus der Konsolen-Shell
-
21-12-2019 - |
Frage
Ich habe CakePHP 2.4.4 verwendet, um den interaktiven Webteil meiner App zu erstellen, und das läuft sehr gut.CakePHP ist großartig.
Ich führe jetzt einige unterstützende Hintergrundprozesse durch.Die Konsole und die Shell scheinen dafür geeignet zu sein, da sie Zugriff auf die Modelle haben.
Ich habe den Code geschrieben und er funktioniert, aber ich versuche, in dasselbe Protokoll zu schreiben, das ich für die Modelle verwende.In den Modellen habe ich eine AfterSave-Funktion, um alle Datenbankänderungen zu protokollieren, und ich habe sie einfach verwendet $this->log("$model $logEntry", 'info');
ins Protokoll schreiben.
Das funktioniert in der Shell nicht, aber ich dachte das CakeLog::write('info', "$model $logEntry");
könnte funktionieren, aber es funktioniert auch nicht.
Muss ich CakeLog initialisieren, um auf die richtigen Protokolldateien zu verweisen?
<?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);
}
}
}
?>
Lösung
Haben Sie einen Standard-Listener/-Bereich für diese Protokolltypen eingerichtet?Wenn nicht, werden sie nicht protokolliert.
// Setup a 'default' cache configuration for use in the application.
Cache::config('default', array('engine' => 'File'));
Zum Beispiel in Ihrer bootstrap.php
Sehen http://book.cakephp.org/2.0/en/appendices/2-2-migration-guide.html#log
Andere Tipps
Sie müssen es einrichten default
Protokollstrom schreibt schließlich in eine Datei app/Config/bootstrap.php
.
CakeLog
konfiguriert sich nicht mehr automatisch.Infolgedessen werden Protokolldateien nicht mehr automatisch erstellt, wenn kein Stream zuhört.Stellen Sie sicher, dass Sie mindestens einen habendefault
Stream Setup, wenn Sie alle Arten und Ebenen anhören möchten.Normalerweise können Sie einfach den Kern festlegenFileLog
Klasse zum Ausgabe inapp/tmp/logs/
:CakeLog::config('default', array( 'engine' => 'File' ));
Sehen Protokollierung → In Protokolle schreiben Abschnitt des CookBook 2.x