TYPO3  7.6
IntrospectionProcessor.php
Go to the documentation of this file.
1 <?php
2 namespace TYPO3\CMS\Core\Log\Processor;
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
18 
23 {
30  protected $appendFullBackTrace = false;
31 
37  protected $shiftBackTraceLevel = 0;
38 
45 
52 
60  {
61  $this->shiftBackTraceLevel = (int)$shiftBackTraceLevel;
62  return $this;
63  }
64 
72  {
73  $this->appendFullBackTrace = (bool)$appendFullBackTrace;
74  return $this;
75  }
76 
77 
86  public function processLogRecord(LogRecord $logRecord)
87  {
88  $trace = $this->getDebugBacktrace();
89 
90  // skip TYPO3\CMS\Core\Log classes
91  foreach ($trace as $traceEntry) {
92  if (isset($traceEntry['class']) && false !== strpos($traceEntry['class'], 'TYPO3\\CMS\\Core\\Log')) {
93  $trace = $this->shiftBacktraceLevel($trace);
94  } else {
95  break;
96  }
97  }
98 
99  // shift a given number of entries from the trace
100  for ($i = 0; $i < $this->shiftBackTraceLevel; $i++) {
101  // shift only if afterwards there is at least one entry left after.
102  if (count($trace) > 1) {
103  $trace = $this->shiftBacktraceLevel($trace);
104  }
105  }
106 
107  if ($this->appendFullBackTrace) {
108  // Add the line and file of the last entry that has these information
109  // to the first backtrace entry if it does not have this information.
110  // This is required in case we have shifted entries and the first entry
111  // is now a call_user_func that does not contain the line and file information.
112  if (!isset($trace[0]['line'])) {
113  $trace[0] = array('line' => $this->precedingBacktraceLine) + $trace[0];
114  }
115  if (!isset($trace[0]['file'])) {
116  $trace[0] = array('file' => $this->precedingBacktraceFile) + $trace[0];
117  }
118 
119  $logRecord->addData(array(
120  'backtrace' => $trace
121  ));
122  } else {
123  $logRecord->addData(array(
124  'file' => isset($trace[0]['file']) ? $trace[0]['file'] : null,
125  'line' => isset($trace[0]['line']) ? $trace[0]['line'] : null,
126  'class' => isset($trace[0]['class']) ? $trace[0]['class'] : null,
127  'function' => isset($trace[0]['function']) ? $trace[0]['function'] : null
128  ));
129  }
130 
131  return $logRecord;
132  }
133 
140  protected function shiftBacktraceLevel(array $backtrace)
141  {
142  if (isset($backtrace[0]['file'])) {
143  $this->precedingBacktraceFile = $backtrace[0]['file'];
144  }
145  if (isset($backtrace[0]['line'])) {
146  $this->precedingBacktraceLine = $backtrace[0]['line'];
147  }
148  array_shift($backtrace);
149 
150  return $backtrace;
151  }
152 
158  protected function getDebugBacktrace()
159  {
160  return debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
161  }
162 }