PHP ruft die Zeilennummer aus dem Protokollierungsereignis ab
-
13-09-2020 - |
Frage
Ok, ich habe noch eine Frage HIER für meine Protokollierungsklasse, aber ich wollte in der Lage sein, die Zeilennummer des aufrufenden Skripts zum Protokolldateieintrag hinzuzufügen.
Ich habe gesehen __Linie__ aber das gibt mir die Zeilennummer der Zeile, in der sich das befindet.
Beispiel:
a.php
$log = new Logger();
$log->debug('hello'); // Say this is line #20
Jetzt verwende ich in meiner Logger.php-Klasse im debug() das __Linie__ Magic Constant zum Beispiel in Zeile #300.Wenn ich das Skript ausführe, möchte ich, dass der Protokolleintrag „in Zeile 20“ lautet, aber er lautet „in Zeile 300“.Gibt es außer der Übergabe der Zeilennummer an die Funktion noch eine andere Möglichkeit, dies zu tun?
Beispiel einer Debug-Klassenfunktion
public function debug($message) {
if(DEBUG) {
$this->calling_script = $this->getScriptBaseName();
$this->log_file = LOG_FILE_DIRECTORY."/".$this->calling_script.".log";
$this->fh = fopen($this->log_file, 'a') or die("Can't open log file: ".$this->log_file);
if($this->first_run) {
$this->log_entry = "\n[" . date("Y-m-d H:i:s", mktime()) . "][debug][line:".__LINE__."]:\t".$message."\n";
} else {
$this->log_entry = "[" . date("Y-m-d H:i:s", mktime()) . "][debug][line:".__LINE__."]:\t".$message."\n";
}
fwrite($this->fh, $this->log_entry);
fclose($this->fh);
$this->first_run = false;
}
}
BEARBEITEN:debug_backtrace() funktioniert großartig!!!Unten wird gearbeitet
public function debug($message) {
if(DEBUG) {
$debug_arr = debug_backtrace();
$this->calling_script = $this->getScriptBaseName();
$this->log_file = LOG_FILE_DIRECTORY."/".$this->calling_script.".log";
$this->fh = fopen($this->log_file, 'a') or die("Can't open log file: ".$this->log_file);
if($this->first_run) {
$this->log_entry = "\n[" . date("Y-m-d H:i:s", mktime()) . "][debug]:\t".$message." [line:".$debug_arr[0]['line']."]\n";
} else {
$this->log_entry = "[" . date("Y-m-d H:i:s", mktime()) . "][debug]:\t".$message." [line:".$debug_arr[0]['line']."]\n";
}
fwrite($this->fh, $this->log_entry);
fclose($this->fh);
$this->first_run = false;
}
}
Lösung
Sie müssen verwenden debug_backtrace
dafür sonst immer die Zeile übergeben (mit __LINE__
) zur Funktion.
Andere Tipps
Haben Sie gesehen, wie Sie gesehen haben debug_backtrace () ?Ich bin mir nicht sicher, obwohl es seinen Overhead ist.