1 | <?php |
---|
2 | /** |
---|
3 | * Licensed to the Apache Software Foundation (ASF) under one or more |
---|
4 | * contributor license agreements. See the NOTICE file distributed with |
---|
5 | * this work for additional information regarding copyright ownership. |
---|
6 | * The ASF licenses this file to You under the Apache License, Version 2.0 |
---|
7 | * (the "License"); you may not use this file except in compliance with |
---|
8 | * the License. You may obtain a copy of the License at |
---|
9 | * |
---|
10 | * http://www.apache.org/licenses/LICENSE-2.0 |
---|
11 | * |
---|
12 | * Unless required by applicable law or agreed to in writing, software |
---|
13 | * distributed under the License is distributed on an "AS IS" BASIS, |
---|
14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
---|
15 | * See the License for the specific language governing permissions and |
---|
16 | * limitations under the License. |
---|
17 | * |
---|
18 | * |
---|
19 | * @package log4php |
---|
20 | * @subpackage spi |
---|
21 | */ |
---|
22 | |
---|
23 | /** |
---|
24 | * @ignore |
---|
25 | */ |
---|
26 | if (!defined('LOG4PHP_DIR')) define('LOG4PHP_DIR', dirname(__FILE__) . '/..'); |
---|
27 | |
---|
28 | /** |
---|
29 | */ |
---|
30 | require_once(LOG4PHP_DIR . '/spi/LoggerLocationInfo.php'); |
---|
31 | require_once(LOG4PHP_DIR . '/LoggerManager.php'); |
---|
32 | require_once(LOG4PHP_DIR . '/LoggerMDC.php'); |
---|
33 | require_once(LOG4PHP_DIR . '/LoggerNDC.php'); |
---|
34 | |
---|
35 | /** |
---|
36 | * The internal representation of logging event. |
---|
37 | * |
---|
38 | * @author Marco Vassura |
---|
39 | * @version $Revision: 635069 $ |
---|
40 | * @package log4php |
---|
41 | * @subpackage spi |
---|
42 | */ |
---|
43 | class LoggerLoggingEvent { |
---|
44 | |
---|
45 | private static $startTime; |
---|
46 | |
---|
47 | /** |
---|
48 | * @var string Fully Qualified Class Name of the calling category class. |
---|
49 | */ |
---|
50 | var $fqcn; |
---|
51 | |
---|
52 | /** |
---|
53 | * @var Logger reference |
---|
54 | */ |
---|
55 | var $logger = null; |
---|
56 | |
---|
57 | /** |
---|
58 | * The category (logger) name. |
---|
59 | * This field will be marked as private in future |
---|
60 | * releases. Please do not access it directly. |
---|
61 | * Use the {@link getLoggerName()} method instead. |
---|
62 | * @deprecated |
---|
63 | */ |
---|
64 | var $categoryName; |
---|
65 | |
---|
66 | /** |
---|
67 | * Level of logging event. |
---|
68 | * <p> This field should not be accessed directly. You shoud use the |
---|
69 | * {@link getLevel()} method instead. |
---|
70 | * |
---|
71 | * @deprecated |
---|
72 | * @var LoggerLevel |
---|
73 | */ |
---|
74 | protected $level; |
---|
75 | |
---|
76 | /** |
---|
77 | * @var string The nested diagnostic context (NDC) of logging event. |
---|
78 | */ |
---|
79 | var $ndc; |
---|
80 | |
---|
81 | /** |
---|
82 | * Have we tried to do an NDC lookup? If we did, there is no need |
---|
83 | * to do it again. Note that its value is always false when |
---|
84 | * serialized. Thus, a receiving SocketNode will never use it's own |
---|
85 | * (incorrect) NDC. See also writeObject method. |
---|
86 | * @var boolean |
---|
87 | */ |
---|
88 | var $ndcLookupRequired = true; |
---|
89 | |
---|
90 | /** |
---|
91 | * Have we tried to do an MDC lookup? If we did, there is no need |
---|
92 | * to do it again. Note that its value is always false when |
---|
93 | * serialized. See also the getMDC and getMDCCopy methods. |
---|
94 | * @var boolean |
---|
95 | */ |
---|
96 | var $mdcCopyLookupRequired = true; |
---|
97 | |
---|
98 | /** |
---|
99 | * @var mixed The application supplied message of logging event. |
---|
100 | */ |
---|
101 | var $message; |
---|
102 | |
---|
103 | /** |
---|
104 | * The application supplied message rendered through the log4php |
---|
105 | * objet rendering mechanism. At present renderedMessage == message. |
---|
106 | * @var string |
---|
107 | */ |
---|
108 | var $renderedMessage = null; |
---|
109 | |
---|
110 | /** |
---|
111 | * The name of thread in which this logging event was generated. |
---|
112 | * log4php saves here the process id via {@link PHP_MANUAL#getmypid getmypid()} |
---|
113 | * @var mixed |
---|
114 | */ |
---|
115 | var $threadName = null; |
---|
116 | |
---|
117 | /** |
---|
118 | * The number of seconds elapsed from 1/1/1970 until logging event |
---|
119 | * was created plus microseconds if available. |
---|
120 | * @var float |
---|
121 | */ |
---|
122 | public $timeStamp; |
---|
123 | |
---|
124 | /** |
---|
125 | * @var LoggerLocationInfo Location information for the caller. |
---|
126 | */ |
---|
127 | var $locationInfo = null; |
---|
128 | |
---|
129 | /** |
---|
130 | * Instantiate a LoggingEvent from the supplied parameters. |
---|
131 | * |
---|
132 | * <p>Except {@link $timeStamp} all the other fields of |
---|
133 | * LoggerLoggingEvent are filled when actually needed. |
---|
134 | * |
---|
135 | * @param string $fqcn name of the caller class. |
---|
136 | * @param mixed $logger The {@link Logger} category of this event or the logger name. |
---|
137 | * @param LoggerLevel $priority The level of this event. |
---|
138 | * @param mixed $message The message of this event. |
---|
139 | * @param integer $timeStamp the timestamp of this logging event. |
---|
140 | */ |
---|
141 | public function __construct($fqcn, $logger, $priority, $message, $timeStamp = null) |
---|
142 | { |
---|
143 | $this->fqcn = $fqcn; |
---|
144 | if ($logger instanceof Logger) { |
---|
145 | $this->logger = $logger; |
---|
146 | $this->categoryName = $logger->getName(); |
---|
147 | } else { |
---|
148 | $this->categoryName = strval($logger); |
---|
149 | } |
---|
150 | $this->level = $priority; |
---|
151 | $this->message = $message; |
---|
152 | if ($timeStamp !== null && is_float($timeStamp)) { |
---|
153 | $this->timeStamp = $timeStamp; |
---|
154 | } else { |
---|
155 | if (function_exists('microtime')) { |
---|
156 | // get microtime as float |
---|
157 | $this->timeStamp = microtime(true); |
---|
158 | } else { |
---|
159 | $this->timeStamp = floatval(time()); |
---|
160 | } |
---|
161 | } |
---|
162 | } |
---|
163 | |
---|
164 | /** |
---|
165 | * Set the location information for this logging event. The collected |
---|
166 | * information is cached for future use. |
---|
167 | * |
---|
168 | * <p>This method uses {@link PHP_MANUAL#debug_backtrace debug_backtrace()} function (if exists) |
---|
169 | * to collect informations about caller.</p> |
---|
170 | * <p>It only recognize informations generated by {@link Logger} and its subclasses.</p> |
---|
171 | * @return LoggerLocationInfo |
---|
172 | */ |
---|
173 | public function getLocationInformation() |
---|
174 | { |
---|
175 | if($this->locationInfo === null) { |
---|
176 | |
---|
177 | $locationInfo = array(); |
---|
178 | |
---|
179 | if (function_exists('debug_backtrace')) { |
---|
180 | $trace = debug_backtrace(); |
---|
181 | $prevHop = null; |
---|
182 | // make a downsearch to identify the caller |
---|
183 | $hop = array_pop($trace); |
---|
184 | while ($hop !== null) { |
---|
185 | $className = @strtolower($hop['class']); |
---|
186 | if ( !empty($className) and ($className == 'logger' or $className == 'loggercategory' or |
---|
187 | @strtolower(get_parent_class($className)) == 'logger' or |
---|
188 | @strtolower(get_parent_class($className)) == 'loggercategory')) { |
---|
189 | $locationInfo['line'] = $hop['line']; |
---|
190 | $locationInfo['file'] = $hop['file']; |
---|
191 | break; |
---|
192 | } |
---|
193 | $prevHop = $hop; |
---|
194 | $hop = array_pop($trace); |
---|
195 | } |
---|
196 | $locationInfo['class'] = isset($prevHop['class']) ? $prevHop['class'] : 'main'; |
---|
197 | if (isset($prevHop['function']) and |
---|
198 | $prevHop['function'] !== 'include' and |
---|
199 | $prevHop['function'] !== 'include_once' and |
---|
200 | $prevHop['function'] !== 'require' and |
---|
201 | $prevHop['function'] !== 'require_once') { |
---|
202 | |
---|
203 | $locationInfo['function'] = $prevHop['function']; |
---|
204 | } else { |
---|
205 | $locationInfo['function'] = 'main'; |
---|
206 | } |
---|
207 | } |
---|
208 | |
---|
209 | $this->locationInfo = new LoggerLocationInfo($locationInfo, $this->fqcn); |
---|
210 | } |
---|
211 | return $this->locationInfo; |
---|
212 | } |
---|
213 | |
---|
214 | /** |
---|
215 | * Return the level of this event. Use this form instead of directly |
---|
216 | * accessing the {@link $level} field. |
---|
217 | * @return LoggerLevel |
---|
218 | */ |
---|
219 | public function getLevel() |
---|
220 | { |
---|
221 | return $this->level; |
---|
222 | } |
---|
223 | |
---|
224 | /** |
---|
225 | * Return the name of the logger. Use this form instead of directly |
---|
226 | * accessing the {@link $categoryName} field. |
---|
227 | * @return string |
---|
228 | */ |
---|
229 | public function getLoggerName() |
---|
230 | { |
---|
231 | return $this->categoryName; |
---|
232 | } |
---|
233 | |
---|
234 | /** |
---|
235 | * Return the message for this logging event. |
---|
236 | * |
---|
237 | * <p>Before serialization, the returned object is the message |
---|
238 | * passed by the user to generate the logging event. After |
---|
239 | * serialization, the returned value equals the String form of the |
---|
240 | * message possibly after object rendering. |
---|
241 | * @return mixed |
---|
242 | */ |
---|
243 | public function getMessage() |
---|
244 | { |
---|
245 | if($this->message !== null) { |
---|
246 | return $this->message; |
---|
247 | } else { |
---|
248 | return $this->getRenderedMessage(); |
---|
249 | } |
---|
250 | } |
---|
251 | |
---|
252 | /** |
---|
253 | * This method returns the NDC for this event. It will return the |
---|
254 | * correct content even if the event was generated in a different |
---|
255 | * thread or even on a different machine. The {@link LoggerNDC::get()} method |
---|
256 | * should <b>never</b> be called directly. |
---|
257 | * @return string |
---|
258 | */ |
---|
259 | public function getNDC() |
---|
260 | { |
---|
261 | if ($this->ndcLookupRequired) { |
---|
262 | $this->ndcLookupRequired = false; |
---|
263 | $this->ndc = implode(' ',LoggerNDC::get()); |
---|
264 | } |
---|
265 | return $this->ndc; |
---|
266 | } |
---|
267 | |
---|
268 | |
---|
269 | /** |
---|
270 | * Returns the the context corresponding to the <code>key</code> |
---|
271 | * parameter. |
---|
272 | * @return string |
---|
273 | */ |
---|
274 | public function getMDC($key) |
---|
275 | { |
---|
276 | return LoggerMDC::get($key); |
---|
277 | } |
---|
278 | |
---|
279 | /** |
---|
280 | * Render message. |
---|
281 | * @return string |
---|
282 | */ |
---|
283 | public function getRenderedMessage() |
---|
284 | { |
---|
285 | if($this->renderedMessage === null and $this->message !== null) { |
---|
286 | if (is_string($this->message)) { |
---|
287 | $this->renderedMessage = $this->message; |
---|
288 | } else { |
---|
289 | if ($this->logger !== null) { |
---|
290 | $repository = $this->logger->getLoggerRepository(); |
---|
291 | } else { |
---|
292 | $repository = LoggerManager::getLoggerRepository(); |
---|
293 | } |
---|
294 | if (method_exists($repository, 'getRendererMap')) { |
---|
295 | $rendererMap = $repository->getRendererMap(); |
---|
296 | $this->renderedMessage= $rendererMap->findAndRender($this->message); |
---|
297 | } else { |
---|
298 | $this->renderedMessage = (string)$this->message; |
---|
299 | } |
---|
300 | } |
---|
301 | } |
---|
302 | return $this->renderedMessage; |
---|
303 | } |
---|
304 | |
---|
305 | /** |
---|
306 | * Returns the time when the application started, in seconds |
---|
307 | * elapsed since 01.01.1970 plus microseconds if available. |
---|
308 | * |
---|
309 | * @return float |
---|
310 | * @static |
---|
311 | */ |
---|
312 | public static function getStartTime() { |
---|
313 | if (!isset(self::$startTime)) { |
---|
314 | if (function_exists('microtime')) { |
---|
315 | // microtime as float |
---|
316 | self::$startTime = microtime(true); |
---|
317 | } else { |
---|
318 | self::$startTime = floatval(time()); |
---|
319 | } |
---|
320 | } |
---|
321 | return self::$startTime; |
---|
322 | } |
---|
323 | |
---|
324 | /** |
---|
325 | * @return float |
---|
326 | */ |
---|
327 | public function getTimeStamp() |
---|
328 | { |
---|
329 | return $this->timeStamp; |
---|
330 | } |
---|
331 | |
---|
332 | /** |
---|
333 | * @return mixed |
---|
334 | */ |
---|
335 | public function getThreadName() |
---|
336 | { |
---|
337 | if ($this->threadName === null) |
---|
338 | $this->threadName = (string)getmypid(); |
---|
339 | return $this->threadName; |
---|
340 | } |
---|
341 | |
---|
342 | /** |
---|
343 | * @return mixed null |
---|
344 | */ |
---|
345 | public function getThrowableInformation() |
---|
346 | { |
---|
347 | return null; |
---|
348 | } |
---|
349 | |
---|
350 | /** |
---|
351 | * Serialize this object |
---|
352 | * @return string |
---|
353 | */ |
---|
354 | public function toString() |
---|
355 | { |
---|
356 | serialize($this); |
---|
357 | } |
---|
358 | |
---|
359 | /** |
---|
360 | * Avoid serialization of the {@link $logger} object |
---|
361 | */ |
---|
362 | public function __sleep() |
---|
363 | { |
---|
364 | return array( |
---|
365 | 'fqcn','categoryName', |
---|
366 | 'level', |
---|
367 | 'ndc','ndcLookupRequired', |
---|
368 | 'message','renderedMessage', |
---|
369 | 'threadName', |
---|
370 | 'timeStamp', |
---|
371 | 'locationInfo' |
---|
372 | ); |
---|
373 | } |
---|
374 | |
---|
375 | } |
---|
376 | |
---|
377 | LoggerLoggingEvent::getStartTime(); |
---|
378 | |
---|