Elgg  Version master
BacktraceProcessor.php
Go to the documentation of this file.
1 <?php
2 
3 namespace Elgg\Logger;
4 
5 use Elgg\Logger;
7 
12 
13  private $level;
14 
15  private $backtrace_level;
16 
23  public function __construct($level = Logger::WARNING, $backtrace_level = -1) {
24  $this->level = Logger::toMonologLevel($level);
25  $this->backtrace_level = $backtrace_level;
26  }
27 
35  public function __invoke(LogRecord $record): LogRecord {
36  // return if the level is not high enough
37  if ($record->level->isLowerThan($this->level)) {
38  return $record;
39  }
40 
41  $backtrace_level = $this->backtrace_level;
42 
43  $stack = [];
44  $backtrace = debug_backtrace();
45  // never show this call.
46  $backtrace = array_slice($backtrace, 9); // ignore the monolog stack
47 
48  $i = count($backtrace);
49 
50  foreach ($backtrace as $trace) {
51  if (empty($trace['file'])) {
52  // file/line not set for Closures
53  $stack[] = "[#$i] unknown";
54  } else {
55  $stack[] = "[#$i] {$trace['file']}:{$trace['line']}";
56  }
57 
58  $i--;
59 
60  if ($backtrace_level > 0) {
61  if ($backtrace_level <= 1) {
62  break;
63  }
64 
65  $backtrace_level--;
66  }
67  }
68 
69  $record['extra']['backtrace'] = $stack;
70 
71  return $record;
72  }
73 }
Inject backtrace stack into the record.
__invoke(LogRecord $record)
Process record.
__construct($level=Logger::WARNING, $backtrace_level=-1)
Constructor.