2010-07-09 13 views
6

Ok Tengo otra pregunta HERE para mi clase de registro pero quería poder agregar el número de línea del script de llamada a la entrada del archivo de registro.Obtener el número de línea de PHP desde el evento de registro

He visto __Line __ pero esto me da el número de línea de la línea en la que se encuentra.

Ejemplo:

a.php

$log = new Logger(); 
$log->debug('hello'); // Say this is line #20 

Ahora en mi clase Logger.php en el debug() utilizo el __Line __ constante mágica en, por ejemplo, la línea # 300. Cuando ejecuto el script, me gustaría que la entrada del registro lea 'en la línea 20', pero dice 'en la línea 300'. Además de pasar el número de línea a la función, ¿hay alguna otra forma en que pueda hacer esto?

Ejemplo función de clase de depuración

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; 
     }  
    } 

EDIT: debug_backtrace() funciona muy bien !!! Trabajando por debajo de

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; 
     }  
    } 

Respuesta

12

Vas a tener que utilizar debug_backtrace de este o de lo contrario siempre pasar la línea (con __LINE__) a la función.

+4

+1 Tenga en cuenta que 'debug_backtrace' es slooow, por lo que realmente debería utilizarse solo en el modo de depuración. –

Cuestiones relacionadas