Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/wp-rocket/inc/Dependencies/Monolog/Logger.php
Keine Baseline-Datei – Diff nur gegen leer.
1
-
1
+
<?php
2
+
3
+
/*
4
+
* This file is part of the WP_Rocket\Dependencies\Monolog package.
5
+
*
6
+
* (c) Jordi Boggiano <j.boggiano@seld.be>
7
+
*
8
+
* For the full copyright and license information, please view the LICENSE
9
+
* file that was distributed with this source code.
10
+
*/
11
+
12
+
namespace WP_Rocket\Dependencies\Monolog;
13
+
14
+
use WP_Rocket\Dependencies\Monolog\Handler\HandlerInterface;
15
+
use WP_Rocket\Dependencies\Monolog\Handler\StreamHandler;
16
+
use WP_Rocket\Dependencies\Psr\Log\LoggerInterface;
17
+
use WP_Rocket\Dependencies\Psr\Log\InvalidArgumentException;
18
+
use Exception;
19
+
20
+
/**
21
+
* WP_Rocket\Dependencies\Monolog log channel
22
+
*
23
+
* It contains a stack of Handlers and a stack of Processors,
24
+
* and uses them to store records that are added to it.
25
+
*
26
+
* @author Jordi Boggiano <j.boggiano@seld.be>
27
+
*/
28
+
class Logger implements LoggerInterface, ResettableInterface
29
+
{
30
+
/**
31
+
* Detailed debug information
32
+
*/
33
+
const DEBUG = 100;
34
+
35
+
/**
36
+
* Interesting events
37
+
*
38
+
* Examples: User logs in, SQL logs.
39
+
*/
40
+
const INFO = 200;
41
+
42
+
/**
43
+
* Uncommon events
44
+
*/
45
+
const NOTICE = 250;
46
+
47
+
/**
48
+
* Exceptional occurrences that are not errors
49
+
*
50
+
* Examples: Use of deprecated APIs, poor use of an API,
51
+
* undesirable things that are not necessarily wrong.
52
+
*/
53
+
const WARNING = 300;
54
+
55
+
/**
56
+
* Runtime errors
57
+
*/
58
+
const ERROR = 400;
59
+
60
+
/**
61
+
* Critical conditions
62
+
*
63
+
* Example: Application component unavailable, unexpected exception.
64
+
*/
65
+
const CRITICAL = 500;
66
+
67
+
/**
68
+
* Action must be taken immediately
69
+
*
70
+
* Example: Entire website down, database unavailable, etc.
71
+
* This should trigger the SMS alerts and wake you up.
72
+
*/
73
+
const ALERT = 550;
74
+
75
+
/**
76
+
* Urgent alert.
77
+
*/
78
+
const EMERGENCY = 600;
79
+
80
+
/**
81
+
* WP_Rocket\Dependencies\Monolog API version
82
+
*
83
+
* This is only bumped when API breaks are done and should
84
+
* follow the major version of the library
85
+
*
86
+
* @var int
87
+
*/
88
+
const API = 1;
89
+
90
+
/**
91
+
* Logging levels from syslog protocol defined in RFC 5424
92
+
*
93
+
* @var array $levels Logging levels
94
+
*/
95
+
protected static $levels = array(
96
+
self::DEBUG => 'DEBUG',
97
+
self::INFO => 'INFO',
98
+
self::NOTICE => 'NOTICE',
99
+
self::WARNING => 'WARNING',
100
+
self::ERROR => 'ERROR',
101
+
self::CRITICAL => 'CRITICAL',
102
+
self::ALERT => 'ALERT',
103
+
self::EMERGENCY => 'EMERGENCY',
104
+
);
105
+
106
+
/**
107
+
* @var \DateTimeZone
108
+
*/
109
+
protected static $timezone;
110
+
111
+
/**
112
+
* @var string
113
+
*/
114
+
protected $name;
115
+
116
+
/**
117
+
* The handler stack
118
+
*
119
+
* @var HandlerInterface[]
120
+
*/
121
+
protected $handlers;
122
+
123
+
/**
124
+
* Processors that will process all log records
125
+
*
126
+
* To process records of a single handler instead, add the processor on that specific handler
127
+
*
128
+
* @var callable[]
129
+
*/
130
+
protected $processors;
131
+
132
+
/**
133
+
* @var bool
134
+
*/
135
+
protected $microsecondTimestamps = true;
136
+
137
+
/**
138
+
* @var callable
139
+
*/
140
+
protected $exceptionHandler;
141
+
142
+
/**
143
+
* @param string $name The logging channel
144
+
* @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc.
145
+
* @param callable[] $processors Optional array of processors
146
+
*/
147
+
public function __construct($name, array $handlers = array(), array $processors = array())
148
+
{
149
+
$this->name = $name;
150
+
$this->setHandlers($handlers);
151
+
$this->processors = $processors;
152
+
}
153
+
154
+
/**
155
+
* @return string
156
+
*/
157
+
public function getName()
158
+
{
159
+
return $this->name;
160
+
}
161
+
162
+
/**
163
+
* Return a new cloned instance with the name changed
164
+
*
165
+
* @return static
166
+
*/
167
+
public function withName($name)
168
+
{
169
+
$new = clone $this;
170
+
$new->name = $name;
171
+
172
+
return $new;
173
+
}
174
+
175
+
/**
176
+
* Pushes a handler on to the stack.
177
+
*
178
+
* @param HandlerInterface $handler
179
+
* @return $this
180
+
*/
181
+
public function pushHandler(HandlerInterface $handler)
182
+
{
183
+
array_unshift($this->handlers, $handler);
184
+
185
+
return $this;
186
+
}
187
+
188
+
/**
189
+
* Pops a handler from the stack
190
+
*
191
+
* @return HandlerInterface
192
+
*/
193
+
public function popHandler()
194
+
{
195
+
if (!$this->handlers) {
196
+
throw new \LogicException('You tried to pop from an empty handler stack.');
197
+
}
198
+
199
+
return array_shift($this->handlers);
200
+
}
201
+
202
+
/**
203
+
* Set handlers, replacing all existing ones.
204
+
*
205
+
* If a map is passed, keys will be ignored.
206
+
*
207
+
* @param HandlerInterface[] $handlers
208
+
* @return $this
209
+
*/
210
+
public function setHandlers(array $handlers)
211
+
{
212
+
$this->handlers = array();
213
+
foreach (array_reverse($handlers) as $handler) {
214
+
$this->pushHandler($handler);
215
+
}
216
+
217
+
return $this;
218
+
}
219
+
220
+
/**
221
+
* @return HandlerInterface[]
222
+
*/
223
+
public function getHandlers()
224
+
{
225
+
return $this->handlers;
226
+
}
227
+
228
+
/**
229
+
* Adds a processor on to the stack.
230
+
*
231
+
* @param callable $callback
232
+
* @return $this
233
+
*/
234
+
public function pushProcessor($callback)
235
+
{
236
+
if (!is_callable($callback)) {
237
+
throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given');
238
+
}
239
+
array_unshift($this->processors, $callback);
240
+
241
+
return $this;
242
+
}
243
+
244
+
/**
245
+
* Removes the processor on top of the stack and returns it.
246
+
*
247
+
* @return callable
248
+
*/
249
+
public function popProcessor()
250
+
{
251
+
if (!$this->processors) {
252
+
throw new \LogicException('You tried to pop from an empty processor stack.');
253
+
}
254
+
255
+
return array_shift($this->processors);
256
+
}
257
+
258
+
/**
259
+
* @return callable[]
260
+
*/
261
+
public function getProcessors()
262
+
{
263
+
return $this->processors;
264
+
}
265
+
266
+
/**
267
+
* Control the use of microsecond resolution timestamps in the 'datetime'
268
+
* member of new records.
269
+
*
270
+
* Generating microsecond resolution timestamps by calling
271
+
* microtime(true), formatting the result via sprintf() and then parsing
272
+
* the resulting string via \DateTime::createFromFormat() can incur
273
+
* a measurable runtime overhead vs simple usage of DateTime to capture
274
+
* a second resolution timestamp in systems which generate a large number
275
+
* of log events.
276
+
*
277
+
* @param bool $micro True to use microtime() to create timestamps
278
+
*/
279
+
public function useMicrosecondTimestamps($micro)
280
+
{
281
+
$this->microsecondTimestamps = (bool) $micro;
282
+
}
283
+
284
+
/**
285
+
* Adds a log record.
286
+
*
287
+
* @param int $level The logging level
288
+
* @param string $message The log message
289
+
* @param array $context The log context
290
+
* @return bool Whether the record has been processed
291
+
*/
292
+
public function addRecord($level, $message, array $context = array())
293
+
{
294
+
if (!$this->handlers) {
295
+
$this->pushHandler(new StreamHandler('php://stderr', static::DEBUG));
296
+
}
297
+
298
+
$levelName = static::getLevelName($level);
299
+
300
+
// check if any handler will handle this message so we can return early and save cycles
301
+
$handlerKey = null;
302
+
reset($this->handlers);
303
+
while ($handler = current($this->handlers)) {
304
+
if ($handler->isHandling(array('level' => $level))) {
305
+
$handlerKey = key($this->handlers);
306
+
break;
307
+
}
308
+
309
+
next($this->handlers);
310
+
}
311
+
312
+
if (null === $handlerKey) {
313
+
return false;
314
+
}
315
+
316
+
if (!static::$timezone) {
317
+
static::$timezone = new \DateTimeZone(date_default_timezone_get() ?: 'UTC');
318
+
}
319
+
320
+
// php7.1+ always has microseconds enabled, so we do not need this hack
321
+
if ($this->microsecondTimestamps && PHP_VERSION_ID < 70100) {
322
+
$ts = \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true)), static::$timezone);
323
+
} else {
324
+
$ts = new \DateTime('now', static::$timezone);
325
+
}
326
+
$ts->setTimezone(static::$timezone);
327
+
328
+
$record = array(
329
+
'message' => (string) $message,
330
+
'context' => $context,
331
+
'level' => $level,
332
+
'level_name' => $levelName,
333
+
'channel' => $this->name,
334
+
'datetime' => $ts,
335
+
'extra' => array(),
336
+
);
337
+
338
+
try {
339
+
foreach ($this->processors as $processor) {
340
+
$record = call_user_func($processor, $record);
341
+
}
342
+
343
+
while ($handler = current($this->handlers)) {
344
+
if (true === $handler->handle($record)) {
345
+
break;
346
+
}
347
+
348
+
next($this->handlers);
349
+
}
350
+
} catch (Exception $e) {
351
+
$this->handleException($e, $record);
352
+
}
353
+
354
+
return true;
355
+
}
356
+
357
+
/**
358
+
* Ends a log cycle and frees all resources used by handlers.
359
+
*
360
+
* Closing a Handler means flushing all buffers and freeing any open resources/handles.
361
+
* Handlers that have been closed should be able to accept log records again and re-open
362
+
* themselves on demand, but this may not always be possible depending on implementation.
363
+
*
364
+
* This is useful at the end of a request and will be called automatically on every handler
365
+
* when they get destructed.
366
+
*/
367
+
public function close()
368
+
{
369
+
foreach ($this->handlers as $handler) {
370
+
if (method_exists($handler, 'close')) {
371
+
$handler->close();
372
+
}
373
+
}
374
+
}
375
+
376
+
/**
377
+
* Ends a log cycle and resets all handlers and processors to their initial state.
378
+
*
379
+
* Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal
380
+
* state, and getting it back to a state in which it can receive log records again.
381
+
*
382
+
* This is useful in case you want to avoid logs leaking between two requests or jobs when you
383
+
* have a long running process like a worker or an application server serving multiple requests
384
+
* in one process.
385
+
*/
386
+
public function reset()
387
+
{
388
+
foreach ($this->handlers as $handler) {
389
+
if ($handler instanceof ResettableInterface) {
390
+
$handler->reset();
391
+
}
392
+
}
393
+
394
+
foreach ($this->processors as $processor) {
395
+
if ($processor instanceof ResettableInterface) {
396
+
$processor->reset();
397
+
}
398
+
}
399
+
}
400
+
401
+
/**
402
+
* Adds a log record at the DEBUG level.
403
+
*
404
+
* @param string $message The log message
405
+
* @param array $context The log context
406
+
* @return bool Whether the record has been processed
407
+
*/
408
+
public function addDebug($message, array $context = array())
409
+
{
410
+
return $this->addRecord(static::DEBUG, $message, $context);
411
+
}
412
+
413
+
/**
414
+
* Adds a log record at the INFO level.
415
+
*
416
+
* @param string $message The log message
417
+
* @param array $context The log context
418
+
* @return bool Whether the record has been processed
419
+
*/
420
+
public function addInfo($message, array $context = array())
421
+
{
422
+
return $this->addRecord(static::INFO, $message, $context);
423
+
}
424
+
425
+
/**
426
+
* Adds a log record at the NOTICE level.
427
+
*
428
+
* @param string $message The log message
429
+
* @param array $context The log context
430
+
* @return bool Whether the record has been processed
431
+
*/
432
+
public function addNotice($message, array $context = array())
433
+
{
434
+
return $this->addRecord(static::NOTICE, $message, $context);
435
+
}
436
+
437
+
/**
438
+
* Adds a log record at the WARNING level.
439
+
*
440
+
* @param string $message The log message
441
+
* @param array $context The log context
442
+
* @return bool Whether the record has been processed
443
+
*/
444
+
public function addWarning($message, array $context = array())
445
+
{
446
+
return $this->addRecord(static::WARNING, $message, $context);
447
+
}
448
+
449
+
/**
450
+
* Adds a log record at the ERROR level.
451
+
*
452
+
* @param string $message The log message
453
+
* @param array $context The log context
454
+
* @return bool Whether the record has been processed
455
+
*/
456
+
public function addError($message, array $context = array())
457
+
{
458
+
return $this->addRecord(static::ERROR, $message, $context);
459
+
}
460
+
461
+
/**
462
+
* Adds a log record at the CRITICAL level.
463
+
*
464
+
* @param string $message The log message
465
+
* @param array $context The log context
466
+
* @return bool Whether the record has been processed
467
+
*/
468
+
public function addCritical($message, array $context = array())
469
+
{
470
+
return $this->addRecord(static::CRITICAL, $message, $context);
471
+
}
472
+
473
+
/**
474
+
* Adds a log record at the ALERT level.
475
+
*
476
+
* @param string $message The log message
477
+
* @param array $context The log context
478
+
* @return bool Whether the record has been processed
479
+
*/
480
+
public function addAlert($message, array $context = array())
481
+
{
482
+
return $this->addRecord(static::ALERT, $message, $context);
483
+
}
484
+
485
+
/**
486
+
* Adds a log record at the EMERGENCY level.
487
+
*
488
+
* @param string $message The log message
489
+
* @param array $context The log context
490
+
* @return bool Whether the record has been processed
491
+
*/
492
+
public function addEmergency($message, array $context = array())
493
+
{
494
+
return $this->addRecord(static::EMERGENCY, $message, $context);
495
+
}
496
+
497
+
/**
498
+
* Gets all supported logging levels.
499
+
*
500
+
* @return array Assoc array with human-readable level names => level codes.
501
+
*/
502
+
public static function getLevels()
503
+
{
504
+
return array_flip(static::$levels);
505
+
}
506
+
507
+
/**
508
+
* Gets the name of the logging level.
509
+
*
510
+
* @param int $level
511
+
* @return string
512
+
*/
513
+
public static function getLevelName($level)
514
+
{
515
+
if (!isset(static::$levels[$level])) {
516
+
throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels)));
517
+
}
518
+
519
+
return static::$levels[$level];
520
+
}
521
+
522
+
/**
523
+
* Converts PSR-3 levels to WP_Rocket\Dependencies\Monolog ones if necessary
524
+
*
525
+
* @param string|int $level Level number (monolog) or name (PSR-3)
526
+
* @return int
527
+
*/
528
+
public static function toMonologLevel($level)
529
+
{
530
+
if (is_string($level)) {
531
+
// Contains chars of all log levels and avoids using strtoupper() which may have
532
+
// strange results depending on locale (for example, "i" will become "İ")
533
+
$upper = strtr($level, 'abcdefgilmnortuwy', 'ABCDEFGILMNORTUWY');
534
+
if (defined(__CLASS__.'::'.$upper)) {
535
+
return constant(__CLASS__ . '::' . $upper);
536
+
}
537
+
}
538
+
539
+
return $level;
540
+
}
541
+
542
+
/**
543
+
* Checks whether the Logger has a handler that listens on the given level
544
+
*
545
+
* @param int $level
546
+
* @return bool
547
+
*/
548
+
public function isHandling($level)
549
+
{
550
+
$record = array(
551
+
'level' => $level,
552
+
);
553
+
554
+
foreach ($this->handlers as $handler) {
555
+
if ($handler->isHandling($record)) {
556
+
return true;
557
+
}
558
+
}
559
+
560
+
return false;
561
+
}
562
+
563
+
/**
564
+
* Set a custom exception handler
565
+
*
566
+
* @param callable $callback
567
+
* @return $this
568
+
*/
569
+
public function setExceptionHandler($callback)
570
+
{
571
+
if (!is_callable($callback)) {
572
+
throw new \InvalidArgumentException('Exception handler must be valid callable (callback or object with an __invoke method), '.var_export($callback, true).' given');
573
+
}
574
+
$this->exceptionHandler = $callback;
575
+
576
+
return $this;
577
+
}
578
+
579
+
/**
580
+
* @return callable
581
+
*/
582
+
public function getExceptionHandler()
583
+
{
584
+
return $this->exceptionHandler;
585
+
}
586
+
587
+
/**
588
+
* Delegates exception management to the custom exception handler,
589
+
* or throws the exception if no custom handler is set.
590
+
*/
591
+
protected function handleException(Exception $e, array $record)
592
+
{
593
+
if (!$this->exceptionHandler) {
594
+
throw $e;
595
+
}
596
+
597
+
call_user_func($this->exceptionHandler, $e, $record);
598
+
}
599
+
600
+
/**
601
+
* Adds a log record at an arbitrary level.
602
+
*
603
+
* This method allows for compatibility with common interfaces.
604
+
*
605
+
* @param mixed $level The log level
606
+
* @param string $message The log message
607
+
* @param array $context The log context
608
+
* @return bool Whether the record has been processed
609
+
*/
610
+
public function log($level, $message, array $context = array())
611
+
{
612
+
$level = static::toMonologLevel($level);
613
+
614
+
return $this->addRecord($level, $message, $context);
615
+
}
616
+
617
+
/**
618
+
* Adds a log record at the DEBUG level.
619
+
*
620
+
* This method allows for compatibility with common interfaces.
621
+
*
622
+
* @param string $message The log message
623
+
* @param array $context The log context
624
+
* @return bool Whether the record has been processed
625
+
*/
626
+
public function debug($message, array $context = array())
627
+
{
628
+
return $this->addRecord(static::DEBUG, $message, $context);
629
+
}
630
+
631
+
/**
632
+
* Adds a log record at the INFO level.
633
+
*
634
+
* This method allows for compatibility with common interfaces.
635
+
*
636
+
* @param string $message The log message
637
+
* @param array $context The log context
638
+
* @return bool Whether the record has been processed
639
+
*/
640
+
public function info($message, array $context = array())
641
+
{
642
+
return $this->addRecord(static::INFO, $message, $context);
643
+
}
644
+
645
+
/**
646
+
* Adds a log record at the NOTICE level.
647
+
*
648
+
* This method allows for compatibility with common interfaces.
649
+
*
650
+
* @param string $message The log message
651
+
* @param array $context The log context
652
+
* @return bool Whether the record has been processed
653
+
*/
654
+
public function notice($message, array $context = array())
655
+
{
656
+
return $this->addRecord(static::NOTICE, $message, $context);
657
+
}
658
+
659
+
/**
660
+
* Adds a log record at the WARNING level.
661
+
*
662
+
* This method allows for compatibility with common interfaces.
663
+
*
664
+
* @param string $message The log message
665
+
* @param array $context The log context
666
+
* @return bool Whether the record has been processed
667
+
*/
668
+
public function warn($message, array $context = array())
669
+
{
670
+
return $this->addRecord(static::WARNING, $message, $context);
671
+
}
672
+
673
+
/**
674
+
* Adds a log record at the WARNING level.
675
+
*
676
+
* This method allows for compatibility with common interfaces.
677
+
*
678
+
* @param string $message The log message
679
+
* @param array $context The log context
680
+
* @return bool Whether the record has been processed
681
+
*/
682
+
public function warning($message, array $context = array())
683
+
{
684
+
return $this->addRecord(static::WARNING, $message, $context);
685
+
}
686
+
687
+
/**
688
+
* Adds a log record at the ERROR level.
689
+
*
690
+
* This method allows for compatibility with common interfaces.
691
+
*
692
+
* @param string $message The log message
693
+
* @param array $context The log context
694
+
* @return bool Whether the record has been processed
695
+
*/
696
+
public function err($message, array $context = array())
697
+
{
698
+
return $this->addRecord(static::ERROR, $message, $context);
699
+
}
700
+
701
+
/**
702
+
* Adds a log record at the ERROR level.
703
+
*
704
+
* This method allows for compatibility with common interfaces.
705
+
*
706
+
* @param string $message The log message
707
+
* @param array $context The log context
708
+
* @return bool Whether the record has been processed
709
+
*/
710
+
public function error($message, array $context = array())
711
+
{
712
+
return $this->addRecord(static::ERROR, $message, $context);
713
+
}
714
+
715
+
/**
716
+
* Adds a log record at the CRITICAL level.
717
+
*
718
+
* This method allows for compatibility with common interfaces.
719
+
*
720
+
* @param string $message The log message
721
+
* @param array $context The log context
722
+
* @return bool Whether the record has been processed
723
+
*/
724
+
public function crit($message, array $context = array())
725
+
{
726
+
return $this->addRecord(static::CRITICAL, $message, $context);
727
+
}
728
+
729
+
/**
730
+
* Adds a log record at the CRITICAL level.
731
+
*
732
+
* This method allows for compatibility with common interfaces.
733
+
*
734
+
* @param string $message The log message
735
+
* @param array $context The log context
736
+
* @return bool Whether the record has been processed
737
+
*/
738
+
public function critical($message, array $context = array())
739
+
{
740
+
return $this->addRecord(static::CRITICAL, $message, $context);
741
+
}
742
+
743
+
/**
744
+
* Adds a log record at the ALERT level.
745
+
*
746
+
* This method allows for compatibility with common interfaces.
747
+
*
748
+
* @param string $message The log message
749
+
* @param array $context The log context
750
+
* @return bool Whether the record has been processed
751
+
*/
752
+
public function alert($message, array $context = array())
753
+
{
754
+
return $this->addRecord(static::ALERT, $message, $context);
755
+
}
756
+
757
+
/**
758
+
* Adds a log record at the EMERGENCY level.
759
+
*
760
+
* This method allows for compatibility with common interfaces.
761
+
*
762
+
* @param string $message The log message
763
+
* @param array $context The log context
764
+
* @return bool Whether the record has been processed
765
+
*/
766
+
public function emerg($message, array $context = array())
767
+
{
768
+
return $this->addRecord(static::EMERGENCY, $message, $context);
769
+
}
770
+
771
+
/**
772
+
* Adds a log record at the EMERGENCY level.
773
+
*
774
+
* This method allows for compatibility with common interfaces.
775
+
*
776
+
* @param string $message The log message
777
+
* @param array $context The log context
778
+
* @return bool Whether the record has been processed
779
+
*/
780
+
public function emergency($message, array $context = array())
781
+
{
782
+
return $this->addRecord(static::EMERGENCY, $message, $context);
783
+
}
784
+
785
+
/**
786
+
* Set the timezone to be used for the timestamp of log records.
787
+
*
788
+
* This is stored globally for all Logger instances
789
+
*
790
+
* @param \DateTimeZone $tz Timezone object
791
+
*/
792
+
public static function setTimezone(\DateTimeZone $tz)
793
+
{
794
+
self::$timezone = $tz;
795
+
}
796
+
}
797
+