From f7dfa00f084db62b1dec3b9ef683be686cfa31d7 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 22 Jul 2022 17:04:34 +0200 Subject: [PATCH] Add Level::toRFC5424Level method and restore BC to Syslog handlers (broken in #1689) --- src/Monolog/Formatter/SyslogFormatter.php | 4 ++-- src/Monolog/Handler/AbstractSyslogHandler.php | 8 +++++++ src/Monolog/Handler/Syslog/SyslogUtils.php | 22 ------------------- src/Monolog/Handler/SyslogHandler.php | 2 +- .../{Syslog => }/SyslogUdp/UdpSocket.php | 2 +- src/Monolog/Handler/SyslogUdpHandler.php | 8 +++---- src/Monolog/Level.php | 22 +++++++++++++++++++ .../Monolog/Handler/SyslogUdpHandlerTest.php | 6 ++--- tests/Monolog/Handler/UdpSocketTest.php | 6 ++--- 9 files changed, 44 insertions(+), 36 deletions(-) delete mode 100644 src/Monolog/Handler/Syslog/SyslogUtils.php rename src/Monolog/Handler/{Syslog => }/SyslogUdp/UdpSocket.php (97%) diff --git a/src/Monolog/Formatter/SyslogFormatter.php b/src/Monolog/Formatter/SyslogFormatter.php index 0d69fabe..a2fbf70f 100644 --- a/src/Monolog/Formatter/SyslogFormatter.php +++ b/src/Monolog/Formatter/SyslogFormatter.php @@ -56,12 +56,12 @@ class SyslogFormatter extends LineFormatter $extra['procid'] = $this->procid; $extra['priority'] = self::calculatePriority($record->level); $extra['structured-data'] = self::NILVALUE; - + return $extra; } private static function calculatePriority(Level $level): int { - return (self::SYSLOG_FACILITY_USER * 8) + SyslogUtils::toSyslogPriority($level); + return (self::SYSLOG_FACILITY_USER * 8) + $level->toRFC5424Level(); } } diff --git a/src/Monolog/Handler/AbstractSyslogHandler.php b/src/Monolog/Handler/AbstractSyslogHandler.php index 5f3de1fb..695a1c07 100644 --- a/src/Monolog/Handler/AbstractSyslogHandler.php +++ b/src/Monolog/Handler/AbstractSyslogHandler.php @@ -40,6 +40,14 @@ abstract class AbstractSyslogHandler extends AbstractProcessingHandler 'uucp' => \LOG_UUCP, ]; + /** + * Translates Monolog log levels to syslog log priorities. + */ + protected function toSyslogPriority(Level $level): int + { + return $level->toRFC5424Level(); + } + /** * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant */ diff --git a/src/Monolog/Handler/Syslog/SyslogUtils.php b/src/Monolog/Handler/Syslog/SyslogUtils.php deleted file mode 100644 index 61981ba4..00000000 --- a/src/Monolog/Handler/Syslog/SyslogUtils.php +++ /dev/null @@ -1,22 +0,0 @@ - \LOG_DEBUG, - Level::Info => \LOG_INFO, - Level::Notice => \LOG_NOTICE, - Level::Warning => \LOG_WARNING, - Level::Error => \LOG_ERR, - Level::Critical => \LOG_CRIT, - Level::Alert => \LOG_ALERT, - Level::Emergency => \LOG_EMERG, - }; - } -} diff --git a/src/Monolog/Handler/SyslogHandler.php b/src/Monolog/Handler/SyslogHandler.php index 63779c4d..8c24b0a4 100644 --- a/src/Monolog/Handler/SyslogHandler.php +++ b/src/Monolog/Handler/SyslogHandler.php @@ -62,6 +62,6 @@ class SyslogHandler extends AbstractSyslogHandler if (!openlog($this->ident, $this->logopts, $this->facility)) { throw new \LogicException('Can\'t open syslog for ident "'.$this->ident.'" and facility "'.$this->facility.'"' . Utils::getRecordMessageForException($record)); } - syslog(SyslogUtils::toSyslogPriority($record->level), (string) $record->formatted); + syslog($this->toSyslogPriority($record->level), (string) $record->formatted); } } diff --git a/src/Monolog/Handler/Syslog/SyslogUdp/UdpSocket.php b/src/Monolog/Handler/SyslogUdp/UdpSocket.php similarity index 97% rename from src/Monolog/Handler/Syslog/SyslogUdp/UdpSocket.php rename to src/Monolog/Handler/SyslogUdp/UdpSocket.php index a599753d..6a483345 100644 --- a/src/Monolog/Handler/Syslog/SyslogUdp/UdpSocket.php +++ b/src/Monolog/Handler/SyslogUdp/UdpSocket.php @@ -9,7 +9,7 @@ * file that was distributed with this source code. */ -namespace Monolog\Handler\Syslog\SyslogUdp; +namespace Monolog\Handler\SyslogUdp; use Monolog\Utils; use Socket; diff --git a/src/Monolog/Handler/SyslogUdpHandler.php b/src/Monolog/Handler/SyslogUdpHandler.php index 209b3b40..2b47b3b1 100644 --- a/src/Monolog/Handler/SyslogUdpHandler.php +++ b/src/Monolog/Handler/SyslogUdpHandler.php @@ -12,11 +12,11 @@ namespace Monolog\Handler; use DateTimeInterface; -use Monolog\Level; -use Monolog\Handler\Syslog\SyslogUdp\UdpSocket; use Monolog\Handler\Syslog\SyslogUtils; -use Monolog\Utils; +use Monolog\Handler\SyslogUdp\UdpSocket; +use Monolog\Level; use Monolog\LogRecord; +use Monolog\Utils; /** * A Handler for logging to a remote syslogd server. @@ -71,7 +71,7 @@ class SyslogUdpHandler extends AbstractSyslogHandler { $lines = $this->splitMessageIntoLines($record->formatted); - $header = $this->makeCommonSyslogHeader(SyslogUtils::toSyslogPriority($record->level), $record->datetime); + $header = $this->makeCommonSyslogHeader($this->toSyslogPriority($record->level), $record->datetime); foreach ($lines as $line) { $this->socket->write($line, $header); diff --git a/src/Monolog/Level.php b/src/Monolog/Level.php index 5caffdcc..ab04cf4d 100644 --- a/src/Monolog/Level.php +++ b/src/Monolog/Level.php @@ -23,6 +23,7 @@ use Psr\Log\LogLevel; * * - Use ->getName() to get the standard Monolog name which is full uppercased (e.g. "DEBUG") * - Use ->toPsrLogLevel() to get the standard PSR-3 name which is full lowercased (e.g. "debug") + * - Use ->toRFC5424Level() to get the standard RFC 5424 value (e.g. 7 for debug, 0 for emergency) * - Use ->name to get the enum case's name which is capitalized (e.g. "Debug") * * To get the value for filtering, if the includes/isLowerThan/isHigherThan methods are @@ -147,6 +148,8 @@ enum Level: int } /** + * Returns the PSR-3 level matching this instance + * * @phpstan-return \Psr\Log\LogLevel::* */ public function toPsrLogLevel(): string @@ -163,6 +166,25 @@ enum Level: int }; } + /** + * Returns the RFC 5424 level matching this instance + * + * @phpstan-return int<0, 7> + */ + public function toRFC5424Level(): int + { + return match ($this) { + self::Debug => 7, + self::Info => 6, + self::Notice => 5, + self::Warning => 4, + self::Error => 3, + self::Critical => 2, + self::Alert => 1, + self::Emergency => 0, + }; + } + public const VALUES = [ 100, 200, diff --git a/tests/Monolog/Handler/SyslogUdpHandlerTest.php b/tests/Monolog/Handler/SyslogUdpHandlerTest.php index 786b758c..f27d5ad5 100644 --- a/tests/Monolog/Handler/SyslogUdpHandlerTest.php +++ b/tests/Monolog/Handler/SyslogUdpHandlerTest.php @@ -35,7 +35,7 @@ class SyslogUdpHandlerTest extends TestCase $handler->setFormatter(new \Monolog\Formatter\ChromePHPFormatter()); $time = '2014-01-07T12:34:56+00:00'; - $socket = $this->getMockBuilder('Monolog\Handler\Syslog\SyslogUdp\UdpSocket') + $socket = $this->getMockBuilder('Monolog\Handler\SyslogUdp\UdpSocket') ->onlyMethods(['write']) ->setConstructorArgs(['lol']) ->getMock(); @@ -56,7 +56,7 @@ class SyslogUdpHandlerTest extends TestCase $handler = new SyslogUdpHandler("127.0.0.1", 514, "authpriv"); $handler->setFormatter($this->getIdentityFormatter()); - $socket = $this->getMockBuilder('Monolog\Handler\Syslog\SyslogUdp\UdpSocket') + $socket = $this->getMockBuilder('Monolog\Handler\SyslogUdp\UdpSocket') ->onlyMethods(['write']) ->setConstructorArgs(['lol']) ->getMock(); @@ -81,7 +81,7 @@ class SyslogUdpHandlerTest extends TestCase $handler->setFormatter(new \Monolog\Formatter\ChromePHPFormatter()); - $socket = $this->getMockBuilder('\Monolog\Handler\Syslog\SyslogUdp\UdpSocket') + $socket = $this->getMockBuilder('\Monolog\Handler\SyslogUdp\UdpSocket') ->setConstructorArgs(['lol', 999]) ->onlyMethods(['write']) ->getMock(); diff --git a/tests/Monolog/Handler/UdpSocketTest.php b/tests/Monolog/Handler/UdpSocketTest.php index d394361b..986a3ddb 100644 --- a/tests/Monolog/Handler/UdpSocketTest.php +++ b/tests/Monolog/Handler/UdpSocketTest.php @@ -11,8 +11,8 @@ namespace Monolog\Handler; +use Monolog\Handler\SyslogUdp\UdpSocket; use Monolog\Test\TestCase; -use Monolog\Handler\Syslog\SyslogUdp\UdpSocket; /** * @requires extension sockets @@ -21,7 +21,7 @@ class UdpSocketTest extends TestCase { public function testWeDoNotTruncateShortMessages() { - $socket = $this->getMockBuilder('Monolog\Handler\Syslog\SyslogUdp\UdpSocket') + $socket = $this->getMockBuilder('Monolog\Handler\SyslogUdp\UdpSocket') ->onlyMethods(['send']) ->setConstructorArgs(['lol']) ->getMock(); @@ -35,7 +35,7 @@ class UdpSocketTest extends TestCase public function testLongMessagesAreTruncated() { - $socket = $this->getMockBuilder('Monolog\Handler\Syslog\SyslogUdp\UdpSocket') + $socket = $this->getMockBuilder('Monolog\Handler\SyslogUdp\UdpSocket') ->onlyMethods(['send']) ->setConstructorArgs(['lol']) ->getMock();