From 07aac12c726977f8daabe9ba81ef7b69307b55e6 Mon Sep 17 00:00:00 2001 From: "Frederic G. MARAND" Date: Mon, 28 May 2012 20:29:27 +0200 Subject: [PATCH 1/2] Implement the 8 RFC3164 severity levels instead of just 6. - constants defined for the 2 missing levels: NOTICE and EMERGENCY. - add() and () convenience methods added. - TestHandler and tests updated to account for the two extra levels. - surjective mappings from the RFC3164 to only 6 levels changes to bijective. - README updated accordingly. --- README.mdown | 18 ++++--- src/Monolog/Handler/SyslogHandler.php | 14 +++--- src/Monolog/Handler/TestHandler.php | 20 ++++++++ src/Monolog/Logger.php | 59 ++++++++++++++++++----- tests/Monolog/Handler/TestHandlerTest.php | 14 +++--- tests/Monolog/LoggerTest.php | 20 +++++--- 6 files changed, 107 insertions(+), 38 deletions(-) diff --git a/README.mdown b/README.mdown index dd87e66b..f1182430 100644 --- a/README.mdown +++ b/README.mdown @@ -47,22 +47,24 @@ will be created if you don't set one. The formatters normalize and format incoming records so that they can be used by the handlers to output useful information. -Custom severity levels are not available. Only six levels (debug, info, -warning, error, critical, alert) are present for basic filtering purposes, but -for sorting and other use cases that would require flexibility, you should add -Processors to the Logger that can add extra information (tags, user ip, ..) to -the records before they are handled. +Custom severity levels are not available. Only the eight RFC 3164 levels (debug, +info, notice, warning, error, critical, alert, emergency) are present for basic +filtering purposes, but for sorting and other use cases that would require +flexibility, you should add Processors to the Logger that can add extra +information (tags, user ip, ..) to the records before they are handled. Log Levels ---------- -Monolog exposes 6 log levels. Although it is possible to add more by extending -the classes you need, these are generally enough. +Monolog exposes the 8 standard RFC3164 log levels. Although it is possible to +add more by extending the classes you need, these are generally enough. - **DEBUG** (100): Detailed debug information. - **INFO** (200): Interesting events. Examples: User logs in, SQL logs. +- **NOTICE** (250): Normal but significant events. + - **WARNING** (300): Exceptional occurrences that are not errors. Examples: Use of deprecated APIs, poor use of an API, undesirable things that are not necessarily wrong. @@ -77,6 +79,8 @@ the classes you need, these are generally enough. down, database unavailable, etc. This should trigger the SMS alerts and wake you up. +- **EMERGENCY** (600): Emergency: system is unusable. + Docs ==== diff --git a/src/Monolog/Handler/SyslogHandler.php b/src/Monolog/Handler/SyslogHandler.php index 444a5929..26e2ec99 100644 --- a/src/Monolog/Handler/SyslogHandler.php +++ b/src/Monolog/Handler/SyslogHandler.php @@ -32,12 +32,14 @@ class SyslogHandler extends AbstractProcessingHandler * Translates Monolog log levels to syslog log priorities. */ private $logLevels = array( - Logger::DEBUG => LOG_DEBUG, - Logger::INFO => LOG_INFO, - Logger::WARNING => LOG_WARNING, - Logger::ERROR => LOG_ERR, - Logger::CRITICAL => LOG_CRIT, - Logger::ALERT => LOG_ALERT, + Logger::DEBUG => LOG_DEBUG, + Logger::INFO => LOG_INFO, + Logger::NOTICE => LOG_NOTICE, + Logger::WARNING => LOG_WARNING, + Logger::ERROR => LOG_ERR, + Logger::CRITICAL => LOG_CRIT, + Logger::ALERT => LOG_ALERT, + Logger::EMERGENCY => LOG_EMERG, ); /** diff --git a/src/Monolog/Handler/TestHandler.php b/src/Monolog/Handler/TestHandler.php index 8f478557..a5fab339 100644 --- a/src/Monolog/Handler/TestHandler.php +++ b/src/Monolog/Handler/TestHandler.php @@ -30,6 +30,11 @@ class TestHandler extends AbstractProcessingHandler return $this->records; } + public function hasEmergency($record) + { + return $this->hasRecord($record, Logger::EMERGENCY); + } + public function hasAlert($record) { return $this->hasRecord($record, Logger::ALERT); @@ -50,6 +55,11 @@ class TestHandler extends AbstractProcessingHandler return $this->hasRecord($record, Logger::WARNING); } + public function hasNotice($record) + { + return $this->hasRecord($record, Logger::NOTICE); + } + public function hasInfo($record) { return $this->hasRecord($record, Logger::INFO); @@ -60,6 +70,11 @@ class TestHandler extends AbstractProcessingHandler return $this->hasRecord($record, Logger::DEBUG); } + public function hasEmergencyRecords() + { + return isset($this->recordsByLevel[Logger::EMERGENCY]); + } + public function hasAlertRecords() { return isset($this->recordsByLevel[Logger::ALERT]); @@ -80,6 +95,11 @@ class TestHandler extends AbstractProcessingHandler return isset($this->recordsByLevel[Logger::WARNING]); } + public function hasNoticeRecords() + { + return isset($this->recordsByLevel[Logger::NOTICE]); + } + public function hasInfoRecords() { return isset($this->recordsByLevel[Logger::INFO]); diff --git a/src/Monolog/Logger.php b/src/Monolog/Logger.php index 91a6ca4c..64c11b96 100644 --- a/src/Monolog/Logger.php +++ b/src/Monolog/Logger.php @@ -36,6 +36,11 @@ class Logger */ const INFO = 200; + /** + * Uncommon events + */ + const NOTICE = 250; + /** * Exceptional occurrences that are not errors * @@ -64,13 +69,20 @@ class Logger */ const ALERT = 550; + /** + * Urgent alert. + */ + const EMERGENCY = 600; + protected static $levels = array( 100 => 'DEBUG', 200 => 'INFO', + 250 => 'NOTICE', 300 => 'WARNING', 400 => 'ERROR', 500 => 'CRITICAL', 550 => 'ALERT', + 600 => 'EMERGENCY', ); protected $name; @@ -219,6 +231,18 @@ class Logger return $this->addRecord(self::INFO, $message, $context); } + /** + * Adds a log record at the NOTICE level. + * + * @param string $message The log message + * @param array $context The log context + * @return Boolean Whether the record has been processed + */ + public function addNotice($message, array $context = array()) + { + return $this->addRecord(self::NOTICE, $message, $context); + } + /** * Adds a log record at the WARNING level. * @@ -267,6 +291,19 @@ class Logger return $this->addRecord(self::ALERT, $message, $context); } + /** + * Adds a log record at the EMERGENCY level. + * + * @param string $message The log message + * @param array $context The log context + * @return Boolean Whether the record has been processed + */ + public function addEmergency($message, array $context = array()) + { + return $this->addRecord(self::EMERGENCY, $message, $context); + } + + /** * Gets the name of the logging level. * @@ -310,7 +347,7 @@ class Logger /** * Adds a log record at the DEBUG level. * - * This method allows to have an easy ZF compatibility. + * This method allows to have an easy ZF/Symfony 2 compatibility. * * @param string $message The log message * @param array $context The log context @@ -324,7 +361,7 @@ class Logger /** * Adds a log record at the INFO level. * - * This method allows to have an easy ZF compatibility. + * This method allows to have an easy ZF/Symfony 2 compatibility. * * @param string $message The log message * @param array $context The log context @@ -338,7 +375,7 @@ class Logger /** * Adds a log record at the INFO level. * - * This method allows to have an easy ZF compatibility. + * This method allows to have an easy ZF/Symfony 2 compatibility. * * @param string $message The log message * @param array $context The log context @@ -346,13 +383,13 @@ class Logger */ public function notice($message, array $context = array()) { - return $this->addRecord(self::INFO, $message, $context); + return $this->addRecord(self::NOTICE, $message, $context); } /** * Adds a log record at the WARNING level. * - * This method allows to have an easy ZF compatibility. + * This method allows to have an easy ZF/Symfony 2 compatibility. * * @param string $message The log message * @param array $context The log context @@ -366,7 +403,7 @@ class Logger /** * Adds a log record at the ERROR level. * - * This method allows to have an easy ZF compatibility. + * This method allows to have an easy ZF/Symfony 2 compatibility. * * @param string $message The log message * @param array $context The log context @@ -380,7 +417,7 @@ class Logger /** * Adds a log record at the CRITICAL level. * - * This method allows to have an easy ZF compatibility. + * This method allows to have an easy ZF/Symfony 2 compatibility. * * @param string $message The log message * @param array $context The log context @@ -394,7 +431,7 @@ class Logger /** * Adds a log record at the ALERT level. * - * This method allows to have an easy ZF compatibility. + * This method allows to have an easy ZF/Symfony 2 compatibility. * * @param string $message The log message * @param array $context The log context @@ -406,9 +443,9 @@ class Logger } /** - * Adds a log record at the ALERT level. + * Adds a log record at the EMERGENCY level. * - * This method allows to have an easy ZF compatibility. + * This method allows to have an easy ZF/Symfony 2 compatibility. * * @param string $message The log message * @param array $context The log context @@ -416,6 +453,6 @@ class Logger */ public function emerg($message, array $context = array()) { - return $this->addRecord(self::ALERT, $message, $context); + return $this->addRecord(self::EMERGENCY, $message, $context); } } diff --git a/tests/Monolog/Handler/TestHandlerTest.php b/tests/Monolog/Handler/TestHandlerTest.php index 1addf7e6..801d80a9 100644 --- a/tests/Monolog/Handler/TestHandlerTest.php +++ b/tests/Monolog/Handler/TestHandlerTest.php @@ -43,12 +43,14 @@ class TestHandlerTest extends TestCase public function methodProvider() { return array( - array('Alert' , Logger::ALERT), - array('Critical', Logger::CRITICAL), - array('Error' , Logger::ERROR), - array('Warning' , Logger::WARNING), - array('Info' , Logger::INFO), - array('Debug' , Logger::DEBUG), + array('Emergency', Logger::EMERGENCY), + array('Alert' , Logger::ALERT), + array('Critical' , Logger::CRITICAL), + array('Error' , Logger::ERROR), + array('Warning' , Logger::WARNING), + array('Info' , Logger::INFO), + array('Notice' , Logger::NOTICE), + array('Debug' , Logger::DEBUG), ); } } diff --git a/tests/Monolog/LoggerTest.php b/tests/Monolog/LoggerTest.php index 403913b3..c5898dab 100644 --- a/tests/Monolog/LoggerTest.php +++ b/tests/Monolog/LoggerTest.php @@ -319,10 +319,12 @@ class LoggerTest extends \PHPUnit_Framework_TestCase * @dataProvider logMethodProvider * @covers Monolog\Logger::addDebug * @covers Monolog\Logger::addInfo + * @covers Monolog\Logger::addNotice * @covers Monolog\Logger::addWarning * @covers Monolog\Logger::addError * @covers Monolog\Logger::addCritical * @covers Monolog\Logger::addAlert + * @covers Monolog\Logger::addEmergency * @covers Monolog\Logger::debug * @covers Monolog\Logger::info * @covers Monolog\Logger::notice @@ -346,22 +348,24 @@ class LoggerTest extends \PHPUnit_Framework_TestCase { return array( // monolog methods - array('addDebug', Logger::DEBUG), - array('addInfo', Logger::INFO), - array('addWarning', Logger::WARNING), - array('addError', Logger::ERROR), - array('addCritical', Logger::CRITICAL), - array('addAlert', Logger::ALERT), + array('addDebug', Logger::DEBUG), + array('addInfo', Logger::INFO), + array('addNotice', Logger::NOTICE), + array('addWarning', Logger::WARNING), + array('addError', Logger::ERROR), + array('addCritical', Logger::CRITICAL), + array('addAlert', Logger::ALERT), + array('addEmergency', Logger::EMERGENCY), // ZF/Sf2 compat methods array('debug', Logger::DEBUG), array('info', Logger::INFO), - array('notice', Logger::INFO), + array('notice', Logger::NOTICE), array('warn', Logger::WARNING), array('err', Logger::ERROR), array('crit', Logger::CRITICAL), array('alert', Logger::ALERT), - array('emerg', Logger::ALERT), + array('emerg', Logger::EMERGENCY), ); } } From 3a337f2212762f4e4e11aa56c59ff011f8e7b5cf Mon Sep 17 00:00:00 2001 From: "Frederic G. MARAND" Date: Sat, 9 Jun 2012 13:48:01 +0200 Subject: [PATCH 2/2] Update wording for 8 levels of severity and RFC3164 to RFC5424. --- README.mdown | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.mdown b/README.mdown index f1182430..8105e6a1 100644 --- a/README.mdown +++ b/README.mdown @@ -47,7 +47,7 @@ will be created if you don't set one. The formatters normalize and format incoming records so that they can be used by the handlers to output useful information. -Custom severity levels are not available. Only the eight RFC 3164 levels (debug, +Custom severity levels are not available. Only the eight RFC 5424 levels (debug, info, notice, warning, error, critical, alert, emergency) are present for basic filtering purposes, but for sorting and other use cases that would require flexibility, you should add Processors to the Logger that can add extra @@ -56,8 +56,9 @@ information (tags, user ip, ..) to the records before they are handled. Log Levels ---------- -Monolog exposes the 8 standard RFC3164 log levels. Although it is possible to -add more by extending the classes you need, these are generally enough. +Monolog supports all 8 logging levels defined in RFC5424, but unless you +specifically need syslog compatibility, it is advised to only use DEBUG, INFO, +WARNING, ERROR, CRITICAL, ALERT. - **DEBUG** (100): Detailed debug information.