2010-07-09 2 views
6

У меня есть еще один вопрос HERE для моего класса ведения журнала, но я хотел, чтобы добавить номер строки вызывающего скрипта в запись файла журнала.PHP получить номер строки из события регистрации

Я видел __Line __, но это дает мне номер строки линии, на которой это находится.

Пример:

a.php

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

Сейчас в моем классе Logger.php в отладке() Я использую __Line __ магическая константа на, например, линии № 300. Когда я запускаю скрипт, я хотел бы, чтобы запись в журнале читалась «в строке 20», но она читала «в строке 300». Кроме того, чтобы передать номер строки функции, есть ли другой способ, которым я мог бы это сделать?

Пример функции отладки класс

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() отлично работает !!! Работая под

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

ответ

12

Вы должны будете использовать debug_backtrace для этого или другого всегда проходят линии (с __LINE__) к функции.

+4

+1 Обратите внимание, что 'debug_backtrace' - это slooow, поэтому он действительно должен использоваться только в режиме отладки. –