Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP get line number from logging event

Ok I have another question HERE for my Logging Class but I wanted to be able to add the line number of the calling script to the log file entry.

I have seen __Line__ but this gives me the line number of the line where this is at.

Example:

a.php

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

Now in my Logger.php class in the debug() I use the __Line__ Magic Constant on for example line #300. When I run the script I would like the log entry to read 'on line 20' but it read 'on line 300'. Besides passing the line number to the function is there any other way I could do this?

Example debug class function

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() works great!!! Working below

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;
        }       
    }
like image 940
Phill Pafford Avatar asked Jul 09 '10 18:07

Phill Pafford


2 Answers

You'll have to use debug_backtrace for this or else always pass the line (with __LINE__) to the function.

like image 121
Artefacto Avatar answered Nov 15 '22 00:11

Artefacto


Have you seen debug_backtrace()? I'm not sure of its overhead though.

like image 35
JosePaulo Avatar answered Nov 15 '22 01:11

JosePaulo