-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
/
ErrorLogHandler.php
94 lines (79 loc) · 2.62 KB
/
ErrorLogHandler.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?php declare(strict_types=1);
/*
* This file is part of the Monolog package.
*
* (c) Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Monolog\Handler;
use Monolog\Formatter\LineFormatter;
use Monolog\Formatter\FormatterInterface;
use Monolog\Level;
use Monolog\Utils;
use Monolog\LogRecord;
/**
* Stores to PHP error_log() handler.
*
* @author Elan Ruusamäe <glen@delfi.ee>
*/
class ErrorLogHandler extends AbstractProcessingHandler
{
public const OPERATING_SYSTEM = 0;
public const SAPI = 4;
/** @var 0|1|3|4 */
protected int $messageType;
protected bool $expandNewlines;
/**
* @param 0|1|3|4 $messageType Says where the error should go.
* @param bool $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries
*
* @throws \InvalidArgumentException If an unsupported message type is set
*/
public function __construct(int $messageType = self::OPERATING_SYSTEM, int|string|Level $level = Level::Debug, bool $bubble = true, bool $expandNewlines = false)
{
parent::__construct($level, $bubble);
if (false === \in_array($messageType, self::getAvailableTypes(), true)) {
$message = sprintf('The given message type "%s" is not supported', print_r($messageType, true));
throw new \InvalidArgumentException($message);
}
$this->messageType = $messageType;
$this->expandNewlines = $expandNewlines;
}
/**
* @return int[] With all available types
*/
public static function getAvailableTypes(): array
{
return [
self::OPERATING_SYSTEM,
self::SAPI,
];
}
/**
* @inheritDoc
*/
protected function getDefaultFormatter(): FormatterInterface
{
return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%');
}
/**
* @inheritDoc
*/
protected function write(LogRecord $record): void
{
if (!$this->expandNewlines) {
error_log((string) $record->formatted, $this->messageType);
return;
}
$lines = preg_split('{[\r\n]+}', (string) $record->formatted);
if ($lines === false) {
$pcreErrorCode = preg_last_error();
throw new \RuntimeException('Failed to preg_split formatted string: ' . $pcreErrorCode . ' / '. preg_last_error_msg());
}
foreach ($lines as $line) {
error_log($line, $this->messageType);
}
}
}