2 namespace TYPO3\CMS\Core\Log\Processor
;
5 * This file is part of the TYPO3 CMS project.
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.
11 * For the full copyright and license information, please read the
12 * LICENSE.txt file that was distributed with this source code.
14 * The TYPO3 project - inspiring people to share!
17 use TYPO3\CMS\Core\Log\LogRecord
;
20 * Introspection processor to automatically add where the log record came from.
22 class IntrospectionProcessor
extends AbstractProcessor
25 * Add the full backtrace to the log entry or
26 * just the last entry of the backtrace
30 protected $appendFullBackTrace = false
;
33 * Number of entries to shift from the backtrace
37 protected $shiftBackTraceLevel = 0;
40 * Temporary storage of the preceding backtrace line number
44 private $precedingBacktraceLine = '';
47 * Temporary storage of the preceding backtrace file
51 private $precedingBacktraceFile = '';
54 * Set the number of levels to be shift from the backtrace
56 * @param int $shiftBackTraceLevel Numbers of levels to shift
57 * @return \TYPO3\CMS\Core\Log\Writer\AbstractWriter
59 public function setShiftBackTraceLevel($shiftBackTraceLevel)
61 $this->shiftBackTraceLevel
= (int)$shiftBackTraceLevel;
66 * Set if the full backtrace should be added to the log or just the last item
68 * @param bool $appendFullBackTrace If the full backtrace should be added
69 * @return \TYPO3\CMS\Core\Log\Writer\AbstractWriter
71 public function setAppendFullBackTrace($appendFullBackTrace)
73 $this->appendFullBackTrace
= (bool
)$appendFullBackTrace;
78 * Add debug backtrace information to logRecord
79 * It adds: filepath, line number, class and function name
81 * @param LogRecord $logRecord The log record to process
82 * @return LogRecord The processed log record with additional data
83 * @see debug_backtrace()
85 public function processLogRecord(LogRecord
$logRecord)
87 $trace = $this->getDebugBacktrace();
89 // skip TYPO3\CMS\Core\Log classes
90 foreach ($trace as $traceEntry) {
91 if (isset($traceEntry['class']) && false
!== strpos($traceEntry['class'], 'TYPO3\\CMS\\Core\\Log')) {
92 $trace = $this->shiftBacktraceLevel($trace);
98 // shift a given number of entries from the trace
99 for ($i = 0; $i < $this->shiftBackTraceLevel
; $i++
) {
100 // shift only if afterwards there is at least one entry left after.
101 if (count($trace) > 1) {
102 $trace = $this->shiftBacktraceLevel($trace);
106 if ($this->appendFullBackTrace
) {
107 // Add the line and file of the last entry that has these information
108 // to the first backtrace entry if it does not have this information.
109 // This is required in case we have shifted entries and the first entry
110 // is now a call_user_func that does not contain the line and file information.
111 if (!isset($trace[0]['line'])) {
112 $trace[0] = ['line' => $this->precedingBacktraceLine
] +
$trace[0];
114 if (!isset($trace[0]['file'])) {
115 $trace[0] = ['file' => $this->precedingBacktraceFile
] +
$trace[0];
118 $logRecord->addData([
119 'backtrace' => $trace
122 $logRecord->addData([
123 'file' => $trace[0]['file'] ?? null
,
124 'line' => $trace[0]['line'] ?? null
,
125 'class' => $trace[0]['class'] ?? null
,
126 'function' => $trace[0]['function'] ?? null
134 * Shift the first item from the backtrace
136 * @param array $backtrace
139 protected function shiftBacktraceLevel(array $backtrace)
141 if (isset($backtrace[0]['file'])) {
142 $this->precedingBacktraceFile
= $backtrace[0]['file'];
144 if (isset($backtrace[0]['line'])) {
145 $this->precedingBacktraceLine
= $backtrace[0]['line'];
147 array_shift($backtrace);
153 * Get the debug backtrace
157 protected function getDebugBacktrace()
159 return debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS
);