[TASK] Removes extra empty lines
[Packages/TYPO3.CMS.git] / typo3 / sysext / core / Classes / Log / Processor / IntrospectionProcessor.php
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
17 use TYPO3\CMS\Core\Log\LogRecord;
18
19 /**
20 * Introspection processor to automatically add where the log record came from.
21 */
22 class IntrospectionProcessor extends AbstractProcessor
23 {
24 /**
25 * Add the full backtrace to the log entry or
26 * just the last entry of the backtrace
27 *
28 * @var bool
29 */
30 protected $appendFullBackTrace = false;
31
32 /**
33 * Number of entries to shift from the backtrace
34 *
35 * @var int
36 */
37 protected $shiftBackTraceLevel = 0;
38
39 /**
40 * Temporary storage of the preceding backtrace line number
41 *
42 * @var string
43 */
44 private $precedingBacktraceLine = '';
45
46 /**
47 * Temporary storage of the preceding backtrace file
48 *
49 * @var string
50 */
51 private $precedingBacktraceFile = '';
52
53 /**
54 * Set the number of levels to be shift from the backtrace
55 *
56 * @param int $shiftBackTraceLevel Numbers of levels to shift
57 * @return \TYPO3\CMS\Core\Log\Writer\AbstractWriter
58 */
59 public function setShiftBackTraceLevel($shiftBackTraceLevel)
60 {
61 $this->shiftBackTraceLevel = (int)$shiftBackTraceLevel;
62 return $this;
63 }
64
65 /**
66 * Set if the full backtrace should be added to the log or just the last item
67 *
68 * @param bool $appendFullBackTrace If the full backtrace should be added
69 * @return \TYPO3\CMS\Core\Log\Writer\AbstractWriter
70 */
71 public function setAppendFullBackTrace($appendFullBackTrace)
72 {
73 $this->appendFullBackTrace = (bool)$appendFullBackTrace;
74 return $this;
75 }
76
77 /**
78 * Add debug backtrace information to logRecord
79 * It adds: filepath, line number, class and function name
80 *
81 * @param LogRecord $logRecord The log record to process
82 * @return LogRecord The processed log record with additional data
83 * @see debug_backtrace()
84 */
85 public function processLogRecord(LogRecord $logRecord)
86 {
87 $trace = $this->getDebugBacktrace();
88
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);
93 } else {
94 break;
95 }
96 }
97
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);
103 }
104 }
105
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] = array('line' => $this->precedingBacktraceLine) + $trace[0];
113 }
114 if (!isset($trace[0]['file'])) {
115 $trace[0] = array('file' => $this->precedingBacktraceFile) + $trace[0];
116 }
117
118 $logRecord->addData(array(
119 'backtrace' => $trace
120 ));
121 } else {
122 $logRecord->addData(array(
123 'file' => isset($trace[0]['file']) ? $trace[0]['file'] : null,
124 'line' => isset($trace[0]['line']) ? $trace[0]['line'] : null,
125 'class' => isset($trace[0]['class']) ? $trace[0]['class'] : null,
126 'function' => isset($trace[0]['function']) ? $trace[0]['function'] : null
127 ));
128 }
129
130 return $logRecord;
131 }
132
133 /**
134 * Shift the first item from the backtrace
135 *
136 * @param array $backtrace
137 * @return array
138 */
139 protected function shiftBacktraceLevel(array $backtrace)
140 {
141 if (isset($backtrace[0]['file'])) {
142 $this->precedingBacktraceFile = $backtrace[0]['file'];
143 }
144 if (isset($backtrace[0]['line'])) {
145 $this->precedingBacktraceLine = $backtrace[0]['line'];
146 }
147 array_shift($backtrace);
148
149 return $backtrace;
150 }
151
152 /**
153 * Get the debug backtrace
154 *
155 * @return array
156 */
157 protected function getDebugBacktrace()
158 {
159 return debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
160 }
161 }