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