2010-07-09 25 views
6

Ok Tôi có một câu hỏi khác HERE cho Lớp Ghi nhật ký của mình nhưng tôi muốn có thể thêm số dòng của tập lệnh gọi vào mục nhập tệp nhật ký.PHP lấy số dòng từ sự kiện ghi

Tôi đã xem __Line __ nhưng điều này mang lại cho tôi số dòng của dòng tại vị trí này.

Ví dụ:

a.php

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

Bây giờ trong lớp Logger.php tôi trong debug() Tôi sử dụng __Line __ liên tục kỳ diệu trên ví dụ dòng # 300. Khi tôi chạy kịch bản, tôi muốn mục nhập nhật ký đọc 'trên dòng 20' nhưng nó đọc 'trên dòng 300'. Bên cạnh việc chuyển số dòng vào hàm, còn cách nào khác tôi có thể làm điều này không?

Ví dụ chức năng debug lớp

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() hoạt động tuyệt vời !!! Làm việc dưới

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

Trả lời

12

Bạn sẽ phải sử dụng debug_backtrace cho điều này hoặc nếu không luôn luôn vượt qua dòng (với __LINE__) để hàm.

+4

+1 Lưu ý rằng 'debug_backtrace' bị hủy, vì vậy nó chỉ nên được sử dụng ở chế độ gỡ lỗi. –

Các vấn đề liên quan