1
0
mirror of https://github.com/Seldaek/monolog.git synced 2025-10-18 23:26:20 +02:00

Convert level/levelName to enums (#1656)

This commit is contained in:
Jordi Boggiano
2022-04-19 21:49:03 +02:00
committed by GitHub
parent 248673e858
commit 2d006a8472
138 changed files with 1297 additions and 1216 deletions

2
.gitignore vendored
View File

@@ -3,6 +3,6 @@ composer.phar
phpunit.xml
composer.lock
.DS_Store
.php_cs.cache
.php-cs-fixer.cache
.hg
.phpunit.result.cache

View File

@@ -17,10 +17,8 @@ $finder = PhpCsFixer\Finder::create()
->in(__DIR__.'/tests')
;
return PhpCsFixer\Config::create()
->setUsingCache(true)
->setRiskyAllowed(true)
->setRules(array(
$config = new PhpCsFixer\Config();
return $config->setRules(array(
'@PSR2' => true,
// some rules disabled as long as 1.x branch is maintained
'binary_operator_spaces' => array(
@@ -30,11 +28,11 @@ return PhpCsFixer\Config::create()
'cast_spaces' => ['space' => 'single'],
'header_comment' => ['header' => $header],
'include' => true,
'class_attributes_separation' => ['elements' => ['method']],
'class_attributes_separation' => array('elements' => array('method' => 'one', 'trait_import' => 'none')),
'no_blank_lines_after_class_opening' => true,
'no_blank_lines_after_phpdoc' => true,
'no_empty_statement' => true,
'no_extra_consecutive_blank_lines' => true,
'no_extra_blank_lines' => true,
'no_leading_import_slash' => true,
'no_leading_namespace_whitespace' => true,
'no_trailing_comma_in_singleline_array' => true,
@@ -49,13 +47,15 @@ return PhpCsFixer\Config::create()
//'phpdoc_scalar' => true,
'phpdoc_trim' => true,
//'phpdoc_types' => true,
'psr0' => true,
'psr_autoloading' => ['dir' => 'src'],
//'array_syntax' => array('syntax' => 'short'),
'declare_strict_types' => true,
'single_blank_line_before_namespace' => true,
'standardize_not_equals' => true,
'ternary_operator_spaces' => true,
'trailing_comma_in_multiline_array' => true,
'trailing_comma_in_multiline' => true,
))
->setUsingCache(true)
->setRiskyAllowed(true)
->setFinder($finder)
;

View File

@@ -33,7 +33,7 @@ use Monolog\Handler\StreamHandler;
// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
$log->pushHandler(new StreamHandler('path/to/your.log', Level::Warning));
// add records to the log
$log->warning('Foo');

View File

@@ -90,7 +90,7 @@ use Monolog\Handler\FirePHPHandler;
// Create the logger
$logger = new Logger('my_logger');
// Now add some handlers
$logger->pushHandler(new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG));
$logger->pushHandler(new StreamHandler(__DIR__.'/my_app.log', Level::Debug));
$logger->pushHandler(new FirePHPHandler());
// You can now use your logger
@@ -170,7 +170,7 @@ use Monolog\Handler\StreamHandler;
use Monolog\Handler\FirePHPHandler;
// Create some handlers
$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);
$stream = new StreamHandler(__DIR__.'/my_app.log', Level::Debug);
$firephp = new FirePHPHandler();
// Create the main logger of the app
@@ -229,7 +229,7 @@ $output = "%datetime% > %level_name% > %message% %context% %extra%\n";
$formatter = new LineFormatter($output, $dateFormat);
// Create a handler
$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);
$stream = new StreamHandler(__DIR__.'/my_app.log', Level::Debug);
$stream->setFormatter($formatter);
// bind it to a logger object

View File

@@ -30,7 +30,7 @@ class PDOHandler extends AbstractProcessingHandler
private $pdo;
private $statement;
public function __construct(PDO $pdo, $level = Logger::DEBUG, bool $bubble = true)
public function __construct(PDO $pdo, $level = Level::Debug, bool $bubble = true)
{
$this->pdo = $pdo;
parent::__construct($level, $bubble);

View File

@@ -26,7 +26,7 @@ $handler = new SocketHandler('unix:///var/log/httpd_app_log.socket');
$handler->setPersistent(true);
// Now add the handler
$logger->pushHandler($handler, Logger::DEBUG);
$logger->pushHandler($handler, Level::Debug);
// You can now use your logger
$logger->info('My logger is now ready');
@@ -36,4 +36,3 @@ $logger->info('My logger is now ready');
In this example, using syslog-ng, you should see the log on the log server:
cweb1 [2012-02-26 00:12:03] my_logger.INFO: My logger is now ready [] []

View File

@@ -11,6 +11,7 @@
namespace Monolog\Formatter;
use Monolog\Level;
use Monolog\Logger;
use Monolog\LogRecord;
@@ -24,18 +25,21 @@ class ChromePHPFormatter implements FormatterInterface
/**
* Translates Monolog log levels to Wildfire levels.
*
* @var array<int, 'log'|'info'|'warn'|'error'>
* @return 'log'|'info'|'warn'|'error'
*/
private $logLevels = [
Logger::DEBUG => 'log',
Logger::INFO => 'info',
Logger::NOTICE => 'info',
Logger::WARNING => 'warn',
Logger::ERROR => 'error',
Logger::CRITICAL => 'error',
Logger::ALERT => 'error',
Logger::EMERGENCY => 'error',
];
private function toWildfireLevel(Level $level): string
{
return match ($level) {
Level::Debug => 'log',
Level::Info => 'info',
Level::Notice => 'info',
Level::Warning => 'warn',
Level::Error => 'error',
Level::Critical => 'error',
Level::Alert => 'error',
Level::Emergency => 'error',
};
}
/**
* {@inheritDoc}
@@ -64,7 +68,7 @@ class ChromePHPFormatter implements FormatterInterface
$record->channel,
$message,
$backtrace,
$this->logLevels[$record->level],
$this->toWildfireLevel($record->level),
];
}

View File

@@ -45,7 +45,7 @@ class FlowdockFormatter implements FormatterInterface
{
$tags = [
'#logs',
'#' . strtolower($record->levelName),
'#' . strtolower($record->levelName->value),
'#' . $record->channel,
];
@@ -56,7 +56,7 @@ class FlowdockFormatter implements FormatterInterface
$subject = sprintf(
'in %s: %s - %s',
$this->source,
$record->levelName,
$record->levelName->value,
$this->getShortMessage($record->message)
);

View File

@@ -60,7 +60,7 @@ class FluentdFormatter implements FormatterInterface
{
$tag = $record->channel;
if ($this->levelTag) {
$tag .= '.' . strtolower($record->levelName);
$tag .= '.' . strtolower($record->levelName->value);
}
$message = [
@@ -70,8 +70,8 @@ class FluentdFormatter implements FormatterInterface
];
if (!$this->levelTag) {
$message['level'] = $record->level;
$message['level_name'] = $record->levelName;
$message['level'] = $record->level->value;
$message['level_name'] = $record->levelName->value;
}
return Utils::jsonEncode([$tag, $record->datetime->getTimestamp(), $message]);

View File

@@ -11,6 +11,7 @@
namespace Monolog\Formatter;
use Monolog\Level;
use Monolog\Logger;
use Gelf\Message;
use Monolog\Utils;
@@ -21,8 +22,6 @@ use Monolog\LogRecord;
* @see http://docs.graylog.org/en/latest/pages/gelf.html
*
* @author Matt Lehner <mlehner@gmail.com>
*
* @phpstan-import-type Level from \Monolog\Logger
*/
class GelfMessageFormatter extends NormalizerFormatter
{
@@ -50,21 +49,20 @@ class GelfMessageFormatter extends NormalizerFormatter
/**
* Translates Monolog log levels to Graylog2 log priorities.
*
* @var array<int, int>
*
* @phpstan-var array<Level, int>
*/
private $logLevels = [
Logger::DEBUG => 7,
Logger::INFO => 6,
Logger::NOTICE => 5,
Logger::WARNING => 4,
Logger::ERROR => 3,
Logger::CRITICAL => 2,
Logger::ALERT => 1,
Logger::EMERGENCY => 0,
];
private function getGraylog2Priority(Level $level): int
{
return match ($level) {
Level::Debug => 7,
Level::Info => 6,
Level::Notice => 5,
Level::Warning => 4,
Level::Error => 3,
Level::Critical => 2,
Level::Alert => 1,
Level::Emergency => 0,
};
}
public function __construct(?string $systemName = null, ?string $extraPrefix = null, string $contextPrefix = 'ctxt_', ?int $maxLength = null)
{
@@ -101,7 +99,7 @@ class GelfMessageFormatter extends NormalizerFormatter
->setTimestamp($record->datetime)
->setShortMessage((string) $record->message)
->setHost($this->systemName)
->setLevel($this->logLevels[$record->level]);
->setLevel($this->getGraylog2Priority($record->level));
// message length + system name length + 200 for padding / metadata
$len = 200 + strlen((string) $record->message) + strlen($this->systemName);

View File

@@ -11,6 +11,7 @@
namespace Monolog\Formatter;
use Monolog\Level;
use Monolog\Logger;
use Monolog\Utils;
use Monolog\LogRecord;
@@ -26,19 +27,20 @@ class HtmlFormatter extends NormalizerFormatter
{
/**
* Translates Monolog log levels to html color priorities.
*
* @var array<int, string>
*/
protected $logLevels = [
Logger::DEBUG => '#CCCCCC',
Logger::INFO => '#28A745',
Logger::NOTICE => '#17A2B8',
Logger::WARNING => '#FFC107',
Logger::ERROR => '#FD7E14',
Logger::CRITICAL => '#DC3545',
Logger::ALERT => '#821722',
Logger::EMERGENCY => '#000000',
];
protected function getLevelColor(Level $level): string
{
return match ($level) {
Level::Debug => '#CCCCCC',
Level::Info => '#28A745',
Level::Notice => '#17A2B8',
Level::Warning => '#FFC107',
Level::Error => '#FD7E14',
Level::Critical => '#DC3545',
Level::Alert => '#821722',
Level::Emergency => '#000000',
};
}
/**
* @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format
@@ -69,14 +71,13 @@ class HtmlFormatter extends NormalizerFormatter
* Create a HTML h1 tag
*
* @param string $title Text to be in the h1
* @param int $level Error level
* @return string
*/
protected function addTitle(string $title, int $level): string
protected function addTitle(string $title, Level $level): string
{
$title = htmlspecialchars($title, ENT_NOQUOTES, 'UTF-8');
return '<h1 style="background: '.$this->logLevels[$level].';color: #ffffff;padding: 5px;" class="monolog-output">'.$title.'</h1>';
return '<h1 style="background: '.$this->getLevelColor($level).';color: #ffffff;padding: 5px;" class="monolog-output">'.$title.'</h1>';
}
/**
@@ -86,7 +87,7 @@ class HtmlFormatter extends NormalizerFormatter
*/
public function format(LogRecord $record): string
{
$output = $this->addTitle($record->levelName, $record->level);
$output = $this->addTitle($record->levelName->value, $record->level);
$output .= '<table cellspacing="1" width="100%" class="monolog-output">';
$output .= $this->addRow('Message', (string) $record->message);

View File

@@ -11,6 +11,7 @@
namespace Monolog\Formatter;
use Monolog\Level;
use Monolog\Logger;
use Monolog\LogRecord;
@@ -20,27 +21,9 @@ use Monolog\LogRecord;
* @author Eric Clemmons (@ericclemmons) <eric@uxdriven.com>
* @author Christophe Coevoet <stof@notk.org>
* @author Kirill chEbba Chebunin <iam@chebba.org>
*
* @phpstan-import-type Level from \Monolog\Logger
*/
class WildfireFormatter extends NormalizerFormatter
{
/**
* Translates Monolog log levels to Wildfire levels.
*
* @var array<Level, string>
*/
private $logLevels = [
Logger::DEBUG => 'LOG',
Logger::INFO => 'INFO',
Logger::NOTICE => 'INFO',
Logger::WARNING => 'WARN',
Logger::ERROR => 'ERROR',
Logger::CRITICAL => 'ERROR',
Logger::ALERT => 'ERROR',
Logger::EMERGENCY => 'ERROR',
];
/**
* @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format
*/
@@ -52,6 +35,25 @@ class WildfireFormatter extends NormalizerFormatter
$this->removeJsonEncodeOption(JSON_UNESCAPED_UNICODE);
}
/**
* Translates Monolog log levels to Wildfire levels.
*
* @return 'LOG'|'INFO'|'WARN'|'ERROR'
*/
private function toWildfireLevel(Level $level): string
{
return match ($level) {
Level::Debug => 'LOG',
Level::Info => 'INFO',
Level::Notice => 'INFO',
Level::Warning => 'WARN',
Level::Error => 'ERROR',
Level::Critical => 'ERROR',
Level::Alert => 'ERROR',
Level::Emergency => 'ERROR',
};
}
/**
* {@inheritDoc}
*
@@ -89,7 +91,7 @@ class WildfireFormatter extends NormalizerFormatter
$label = $record->channel .': '. $record->message;
$message = $message['context']['table'];
} else {
$type = $this->logLevels[$record->level];
$type = $this->toWildfireLevel($record->level);
$label = $record->channel;
}

View File

@@ -11,6 +11,8 @@
namespace Monolog\Handler;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\Logger;
use Monolog\ResettableInterface;
use Psr\Log\LogLevel;
@@ -20,27 +22,20 @@ use Monolog\LogRecord;
* Base Handler class providing basic level/bubble support
*
* @author Jordi Boggiano <j.boggiano@seld.be>
*
* @phpstan-import-type Level from \Monolog\Logger
* @phpstan-import-type LevelName from \Monolog\Logger
*/
abstract class AbstractHandler extends Handler implements ResettableInterface
{
/**
* @var int
* @phpstan-var Level
*/
protected $level = Logger::DEBUG;
protected Level $level = Level::Debug;
/** @var bool */
protected $bubble = true;
/**
* @param int|string $level The minimum logging level at which this handler will be triggered
* @param bool $bubble Whether the messages that are handled can bubble up the stack or not
* @param int|string|Level|LevelName|LogLevel::* $level The minimum logging level at which this handler will be triggered
* @param bool $bubble Whether the messages that are handled can bubble up the stack or not
*
* @phpstan-param Level|LevelName|LogLevel::* $level
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $level
*/
public function __construct($level = Logger::DEBUG, bool $bubble = true)
public function __construct(int|string|Level|LevelName $level = Level::Debug, bool $bubble = true)
{
$this->setLevel($level);
$this->bubble = $bubble;
@@ -51,7 +46,7 @@ abstract class AbstractHandler extends Handler implements ResettableInterface
*/
public function isHandling(LogRecord $record): bool
{
return $record->level >= $this->level;
return $record->level->value >= $this->level->value;
}
/**
@@ -59,8 +54,10 @@ abstract class AbstractHandler extends Handler implements ResettableInterface
*
* @param Level|LevelName|LogLevel::* $level Level or level name
* @return self
*
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $level
*/
public function setLevel($level): self
public function setLevel(int|string|Level|LevelName $level): self
{
$this->level = Logger::toMonologLevel($level);
@@ -69,12 +66,8 @@ abstract class AbstractHandler extends Handler implements ResettableInterface
/**
* Gets minimum logging level at which this handler will be triggered.
*
* @return int
*
* @phpstan-return Level
*/
public function getLevel(): int
public function getLevel(): Level
{
return $this->level;
}

View File

@@ -20,9 +20,6 @@ use Monolog\LogRecord;
*
* @author Jordi Boggiano <j.boggiano@seld.be>
* @author Christophe Coevoet <stof@notk.org>
*
* @phpstan-import-type LevelName from \Monolog\Logger
* @phpstan-import-type Level from \Monolog\Logger
*/
abstract class AbstractProcessingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface
{

View File

@@ -11,14 +11,12 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\LineFormatter;
/**
* Common syslog functionality
*
* @phpstan-import-type Level from \Monolog\Logger
*/
abstract class AbstractSyslogHandler extends AbstractProcessingHandler
{
@@ -27,54 +25,55 @@ abstract class AbstractSyslogHandler extends AbstractProcessingHandler
/**
* Translates Monolog log levels to syslog log priorities.
* @var array
* @phpstan-var array<Level, int>
*/
protected $logLevels = [
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,
];
protected function toSyslogPriority(Level $level): int
{
return match ($level) {
Level::Debug => \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,
};
}
/**
* List of valid log facility names.
* @var array<string, int>
*/
protected $facilities = [
'auth' => LOG_AUTH,
'authpriv' => LOG_AUTHPRIV,
'cron' => LOG_CRON,
'daemon' => LOG_DAEMON,
'kern' => LOG_KERN,
'lpr' => LOG_LPR,
'mail' => LOG_MAIL,
'news' => LOG_NEWS,
'syslog' => LOG_SYSLOG,
'user' => LOG_USER,
'uucp' => LOG_UUCP,
'auth' => \LOG_AUTH,
'authpriv' => \LOG_AUTHPRIV,
'cron' => \LOG_CRON,
'daemon' => \LOG_DAEMON,
'kern' => \LOG_KERN,
'lpr' => \LOG_LPR,
'mail' => \LOG_MAIL,
'news' => \LOG_NEWS,
'syslog' => \LOG_SYSLOG,
'user' => \LOG_USER,
'uucp' => \LOG_UUCP,
];
/**
* @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant
*/
public function __construct($facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true)
public function __construct($facility = \LOG_USER, $level = Level::Debug, bool $bubble = true)
{
parent::__construct($level, $bubble);
if (!defined('PHP_WINDOWS_VERSION_BUILD')) {
$this->facilities['local0'] = LOG_LOCAL0;
$this->facilities['local1'] = LOG_LOCAL1;
$this->facilities['local2'] = LOG_LOCAL2;
$this->facilities['local3'] = LOG_LOCAL3;
$this->facilities['local4'] = LOG_LOCAL4;
$this->facilities['local5'] = LOG_LOCAL5;
$this->facilities['local6'] = LOG_LOCAL6;
$this->facilities['local7'] = LOG_LOCAL7;
$this->facilities['local0'] = \LOG_LOCAL0;
$this->facilities['local1'] = \LOG_LOCAL1;
$this->facilities['local2'] = \LOG_LOCAL2;
$this->facilities['local3'] = \LOG_LOCAL3;
$this->facilities['local4'] = \LOG_LOCAL4;
$this->facilities['local5'] = \LOG_LOCAL5;
$this->facilities['local6'] = \LOG_LOCAL6;
$this->facilities['local7'] = \LOG_LOCAL7;
} else {
$this->facilities['local0'] = 128; // LOG_LOCAL0
$this->facilities['local1'] = 136; // LOG_LOCAL1

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\JsonFormatter;
use PhpAmqpLib\Message\AMQPMessage;
@@ -35,7 +35,7 @@ class AmqpHandler extends AbstractProcessingHandler
* @param AMQPExchange|AMQPChannel $exchange AMQPExchange (php AMQP ext) or PHP AMQP lib channel, ready for use
* @param string|null $exchangeName Optional exchange name, for AMQPChannel (PhpAmqpLib) only
*/
public function __construct($exchange, ?string $exchangeName = null, $level = Logger::DEBUG, bool $bubble = true)
public function __construct($exchange, ?string $exchangeName = null, $level = Level::Debug, bool $bubble = true)
{
if ($exchange instanceof AMQPChannel) {
$this->exchangeName = (string) $exchangeName;
@@ -110,7 +110,7 @@ class AmqpHandler extends AbstractProcessingHandler
*/
protected function getRoutingKey(LogRecord $record): string
{
$routingKey = sprintf('%s.%s', $record->levelName, $record->channel);
$routingKey = sprintf('%s.%s', $record->levelName->value, $record->channel);
return strtolower($routingKey);
}

View File

@@ -11,7 +11,8 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\ResettableInterface;
use Monolog\Formatter\FormatterInterface;
use Monolog\LogRecord;
@@ -46,7 +47,7 @@ class BufferHandler extends AbstractHandler implements ProcessableHandlerInterfa
* @param int $bufferLimit How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
* @param bool $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded
*/
public function __construct(HandlerInterface $handler, int $bufferLimit = 0, $level = Logger::DEBUG, bool $bubble = true, bool $flushOnOverflow = false)
public function __construct(HandlerInterface $handler, int $bufferLimit = 0, int|string|Level|LevelName $level = Level::Debug, bool $bubble = true, bool $flushOnOverflow = false)
{
parent::__construct($level, $bubble);
$this->handler = $handler;
@@ -59,7 +60,7 @@ class BufferHandler extends AbstractHandler implements ProcessableHandlerInterfa
*/
public function handle(LogRecord $record): bool
{
if ($record->level < $this->level) {
if ($record->level->isLowerThan($this->level)) {
return false;
}

View File

@@ -13,7 +13,7 @@ namespace Monolog\Handler;
use Monolog\Formatter\ChromePHPFormatter;
use Monolog\Formatter\FormatterInterface;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\LogRecord;
use Monolog\DateTimeImmutable;
@@ -66,7 +66,7 @@ class ChromePHPHandler extends AbstractProcessingHandler
/** @var bool */
protected static $sendHeaders = true;
public function __construct($level = Logger::DEBUG, bool $bubble = true)
public function __construct($level = Level::Debug, bool $bubble = true)
{
parent::__construct($level, $bubble);
if (!function_exists('json_encode')) {
@@ -155,7 +155,7 @@ class ChromePHPHandler extends AbstractProcessingHandler
$record = new LogRecord(
message: 'Incomplete logs, chrome header size limit reached',
level: Logger::WARNING,
level: Level::Warning,
channel: 'monolog',
datetime: new DateTimeImmutable(true),
);

View File

@@ -13,7 +13,7 @@ namespace Monolog\Handler;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\JsonFormatter;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LogRecord;
/**
@@ -29,7 +29,7 @@ class CouchDBHandler extends AbstractProcessingHandler
/**
* @param mixed[] $options
*/
public function __construct(array $options = [], $level = Logger::DEBUG, bool $bubble = true)
public function __construct(array $options = [], $level = Level::Debug, bool $bubble = true)
{
$this->options = array_merge([
'host' => 'localhost',

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\LogRecord;
@@ -43,7 +43,7 @@ class CubeHandler extends AbstractProcessingHandler
* A valid url must consist of three parts : protocol://host:port
* Only valid protocols used by Cube are http and udp
*/
public function __construct(string $url, $level = Logger::DEBUG, bool $bubble = true)
public function __construct(string $url, $level = Level::Debug, bool $bubble = true)
{
$urlInfo = parse_url($url);

View File

@@ -11,6 +11,8 @@
namespace Monolog\Handler;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\Logger;
use Psr\Log\LogLevel;
use Monolog\LogRecord;
@@ -34,8 +36,6 @@ use Monolog\LogRecord;
* same way.
*
* @author Jordi Boggiano <j.boggiano@seld.be>
* @phpstan-import-type LevelName from \Monolog\Logger
* @phpstan-import-type Level from \Monolog\Logger
*/
class DeduplicationHandler extends BufferHandler
{
@@ -62,15 +62,15 @@ class DeduplicationHandler extends BufferHandler
/**
* @param HandlerInterface $handler Handler.
* @param string $deduplicationStore The file/path where the deduplication log should be kept
* @param string|int $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes
* @param int|string|Level|LevelName|LogLevel::* $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes
* @param int $time The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through
* @param bool $bubble Whether the messages that are handled can bubble up the stack or not
*
* @phpstan-param Level|LevelName|LogLevel::* $deduplicationLevel
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $deduplicationLevel
*/
public function __construct(HandlerInterface $handler, ?string $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, int $time = 60, bool $bubble = true)
public function __construct(HandlerInterface $handler, ?string $deduplicationStore = null, int|string|Level|LevelName $deduplicationLevel = Level::Error, int $time = 60, bool $bubble = true)
{
parent::__construct($handler, 0, Logger::DEBUG, $bubble, false);
parent::__construct($handler, 0, Level::Debug, $bubble, false);
$this->deduplicationStore = $deduplicationStore === null ? sys_get_temp_dir() . '/monolog-dedup-' . substr(md5(__FILE__), 0, 20) .'.log' : $deduplicationStore;
$this->deduplicationLevel = Logger::toMonologLevel($deduplicationLevel);
@@ -86,7 +86,7 @@ class DeduplicationHandler extends BufferHandler
$passthru = null;
foreach ($this->buffer as $record) {
if ($record->level >= $this->deduplicationLevel) {
if ($record->level->value >= $this->deduplicationLevel->value) {
$passthru = $passthru || !$this->isDuplicate($record);
if ($passthru) {
$this->appendRecord($record);
@@ -124,7 +124,7 @@ class DeduplicationHandler extends BufferHandler
for ($i = count($store) - 1; $i >= 0; $i--) {
list($timestamp, $level, $message) = explode(':', $store[$i], 3);
if ($level === $record->levelName && $message === $expectedMessage && $timestamp > $timestampValidity) {
if ($level === $record->levelName->value && $message === $expectedMessage && $timestamp > $timestampValidity) {
return true;
}
@@ -174,6 +174,6 @@ class DeduplicationHandler extends BufferHandler
private function appendRecord(LogRecord $record): void
{
file_put_contents($this->deduplicationStore, $record->datetime->getTimestamp() . ':' . $record->levelName . ':' . preg_replace('{[\r\n].*}', '', $record->message) . "\n", FILE_APPEND);
file_put_contents($this->deduplicationStore, $record->datetime->getTimestamp() . ':' . $record->levelName->value . ':' . preg_replace('{[\r\n].*}', '', $record->message) . "\n", FILE_APPEND);
}
}

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Formatter\NormalizerFormatter;
use Monolog\Formatter\FormatterInterface;
use Doctrine\CouchDB\CouchDBClient;
@@ -27,7 +27,7 @@ class DoctrineCouchDBHandler extends AbstractProcessingHandler
/** @var CouchDBClient */
private $client;
public function __construct(CouchDBClient $client, $level = Logger::DEBUG, bool $bubble = true)
public function __construct(CouchDBClient $client, $level = Level::Debug, bool $bubble = true)
{
$this->client = $client;
parent::__construct($level, $bubble);

View File

@@ -16,7 +16,7 @@ use Aws\DynamoDb\DynamoDbClient;
use Monolog\Formatter\FormatterInterface;
use Aws\DynamoDb\Marshaler;
use Monolog\Formatter\ScalarFormatter;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LogRecord;
/**
@@ -44,7 +44,7 @@ class DynamoDbHandler extends AbstractProcessingHandler
*/
protected $marshaler;
public function __construct(DynamoDbClient $client, string $table, $level = Logger::DEBUG, bool $bubble = true)
public function __construct(DynamoDbClient $client, string $table, $level = Level::Debug, bool $bubble = true)
{
$this->marshaler = new Marshaler;

View File

@@ -14,7 +14,7 @@ namespace Monolog\Handler;
use Elastica\Document;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\ElasticaFormatter;
use Monolog\Logger;
use Monolog\Level;
use Elastica\Client;
use Elastica\Exception\ExceptionInterface;
use Monolog\LogRecord;
@@ -51,7 +51,7 @@ class ElasticaHandler extends AbstractProcessingHandler
* @param Client $client Elastica Client object
* @param mixed[] $options Handler configuration
*/
public function __construct(Client $client, array $options = [], $level = Logger::DEBUG, bool $bubble = true)
public function __construct(Client $client, array $options = [], $level = Level::Debug, bool $bubble = true)
{
parent::__construct($level, $bubble);
$this->client = $client;

View File

@@ -13,7 +13,7 @@ namespace Monolog\Handler;
use Throwable;
use RuntimeException;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\ElasticsearchFormatter;
use InvalidArgumentException;
@@ -58,7 +58,7 @@ class ElasticsearchHandler extends AbstractProcessingHandler
* @param Client $client Elasticsearch Client object
* @param mixed[] $options Handler configuration
*/
public function __construct(Client $client, array $options = [], $level = Logger::DEBUG, bool $bubble = true)
public function __construct(Client $client, array $options = [], $level = Level::Debug, bool $bubble = true)
{
parent::__construct($level, $bubble);
$this->client = $client;

View File

@@ -13,7 +13,7 @@ namespace Monolog\Handler;
use Monolog\Formatter\LineFormatter;
use Monolog\Formatter\FormatterInterface;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\LogRecord;
@@ -36,7 +36,7 @@ class ErrorLogHandler extends AbstractProcessingHandler
* @param int $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
*/
public function __construct(int $messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, bool $bubble = true, bool $expandNewlines = false)
public function __construct(int $messageType = self::OPERATING_SYSTEM, $level = Level::Debug, bool $bubble = true, bool $expandNewlines = false)
{
parent::__construct($level, $bubble);

View File

@@ -11,6 +11,8 @@
namespace Monolog\Handler;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\Logger;
use Monolog\ResettableInterface;
use Monolog\Formatter\FormatterInterface;
@@ -24,8 +26,6 @@ use Monolog\LogRecord;
*
* @author Hennadiy Verkh
* @author Jordi Boggiano <j.boggiano@seld.be>
* @phpstan-import-type Level from \Monolog\Logger
* @phpstan-import-type LevelName from \Monolog\Logger
*/
class FilterHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface
{
@@ -42,10 +42,10 @@ class FilterHandler extends Handler implements ProcessableHandlerInterface, Rese
/**
* Minimum level for logs that are passed to handler
*
* @var int[]
* @phpstan-var array<Level, int>
* @var bool[] Map of Level value => true
* @phpstan-var array<value-of<Level::VALUES>, true>
*/
protected $acceptedLevels;
protected array $acceptedLevels;
/**
* Whether the messages that are handled can bubble up the stack or not
@@ -58,14 +58,14 @@ class FilterHandler extends Handler implements ProcessableHandlerInterface, Rese
* @phpstan-param (callable(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface $handler
*
* @param callable|HandlerInterface $handler Handler or factory callable($record|null, $filterHandler).
* @param int|array $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided
* @param int|string $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array
* @param int|string|Level|LevelName|array<int|string|Level|LevelName|LogLevel::*> $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided
* @param int|string|Level|LevelName|LogLevel::* $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array
* @param bool $bubble Whether the messages that are handled can bubble up the stack or not
*
* @phpstan-param Level|LevelName|LogLevel::*|array<Level|LevelName|LogLevel::*> $minLevelOrList
* @phpstan-param Level|LevelName|LogLevel::* $maxLevel
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::*|array<value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::*> $minLevelOrList
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $maxLevel
*/
public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, bool $bubble = true)
public function __construct($handler, int|string|Level|LevelName|array $minLevelOrList = Level::Debug, int|string|Level|LevelName $maxLevel = Level::Emergency, bool $bubble = true)
{
$this->handler = $handler;
$this->bubble = $bubble;
@@ -77,32 +77,33 @@ class FilterHandler extends Handler implements ProcessableHandlerInterface, Rese
}
/**
* @phpstan-return array<int, Level>
* @phpstan-return list<Level> List of levels
*/
public function getAcceptedLevels(): array
{
return array_flip($this->acceptedLevels);
return array_map(fn(int $level) => Level::from($level), array_keys($this->acceptedLevels));
}
/**
* @param int|string|array $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided
* @param int|string $maxLevel Maximum level or level name to accept, only used if $minLevelOrList is not an array
* @param int|string|Level|LevelName|LogLevel::*|array<int|string|Level|LevelName|LogLevel::*> $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided
* @param int|string|Level|LevelName|LogLevel::* $maxLevel Maximum level or level name to accept, only used if $minLevelOrList is not an array
*
* @phpstan-param Level|LevelName|LogLevel::*|array<Level|LevelName|LogLevel::*> $minLevelOrList
* @phpstan-param Level|LevelName|LogLevel::* $maxLevel
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::*|array<value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::*> $minLevelOrList
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $maxLevel
*/
public function setAcceptedLevels($minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY): self
public function setAcceptedLevels(int|string|Level|LevelName|array $minLevelOrList = Level::Debug, int|string|Level|LevelName $maxLevel = Level::Emergency): self
{
if (is_array($minLevelOrList)) {
$acceptedLevels = array_map('Monolog\Logger::toMonologLevel', $minLevelOrList);
$acceptedLevels = array_map(Logger::toMonologLevel(...), $minLevelOrList);
} else {
$minLevelOrList = Logger::toMonologLevel($minLevelOrList);
$maxLevel = Logger::toMonologLevel($maxLevel);
$acceptedLevels = array_values(array_filter(Logger::getLevels(), function ($level) use ($minLevelOrList, $maxLevel) {
return $level >= $minLevelOrList && $level <= $maxLevel;
}));
$acceptedLevels = array_values(array_filter(Level::cases(), fn (Level $level) => $level->value >= $minLevelOrList->value && $level->value <= $maxLevel->value));
}
$this->acceptedLevels = [];
foreach ($acceptedLevels as $level) {
$this->acceptedLevels[$level->value] = true;
}
$this->acceptedLevels = array_flip($acceptedLevels);
return $this;
}
@@ -112,7 +113,7 @@ class FilterHandler extends Handler implements ProcessableHandlerInterface, Rese
*/
public function isHandling(LogRecord $record): bool
{
return isset($this->acceptedLevels[$record->level]);
return isset($this->acceptedLevels[$record->level->value]);
}
/**

View File

@@ -11,6 +11,8 @@
namespace Monolog\Handler\FingersCrossed;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\Logger;
use Psr\Log\LogLevel;
use Monolog\LogRecord;
@@ -24,50 +26,45 @@ use Monolog\LogRecord;
*
* <code>
* $activationStrategy = new ChannelLevelActivationStrategy(
* Logger::CRITICAL,
* Level::Critical,
* array(
* 'request' => Logger::ALERT,
* 'sensitive' => Logger::ERROR,
* 'request' => Level::Alert,
* 'sensitive' => Level::Error,
* )
* );
* $handler = new FingersCrossedHandler(new StreamHandler('php://stderr'), $activationStrategy);
* </code>
*
* @author Mike Meessen <netmikey@gmail.com>
* @phpstan-import-type Level from \Monolog\Logger
* @phpstan-import-type LevelName from \Monolog\Logger
*/
class ChannelLevelActivationStrategy implements ActivationStrategyInterface
{
/**
* @var Level
*/
private $defaultActionLevel;
private Level $defaultActionLevel;
/**
* @var array<string, Level>
*/
private $channelToActionLevel;
private array $channelToActionLevel;
/**
* @param int|string $defaultActionLevel The default action level to be used if the record's category doesn't match any
* @param array<string, int> $channelToActionLevel An array that maps channel names to action levels.
* @param int|string|Level|LevelName|LogLevel::* $defaultActionLevel The default action level to be used if the record's category doesn't match any
* @param array<string, int|string|Level|LevelName|LogLevel::*> $channelToActionLevel An array that maps channel names to action levels.
*
* @phpstan-param array<string, Level> $channelToActionLevel
* @phpstan-param Level|LevelName|LogLevel::* $defaultActionLevel
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $defaultActionLevel
* @phpstan-param array<string, value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::*> $channelToActionLevel
*/
public function __construct($defaultActionLevel, array $channelToActionLevel = [])
public function __construct(int|string|Level|LevelName $defaultActionLevel, array $channelToActionLevel = [])
{
$this->defaultActionLevel = Logger::toMonologLevel($defaultActionLevel);
$this->channelToActionLevel = array_map('Monolog\Logger::toMonologLevel', $channelToActionLevel);
$this->channelToActionLevel = array_map(Logger::toMonologLevel(...), $channelToActionLevel);
}
public function isHandlerActivated(LogRecord $record): bool
{
if (isset($this->channelToActionLevel[$record->channel])) {
return $record->level >= $this->channelToActionLevel[$record->channel];
return $record->level->value >= $this->channelToActionLevel[$record->channel]->value;
}
return $record->level >= $this->defaultActionLevel;
return $record->level->value >= $this->defaultActionLevel->value;
}
}

View File

@@ -11,37 +11,33 @@
namespace Monolog\Handler\FingersCrossed;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\LogRecord;
use Monolog\Logger;
use Psr\Log\LogLevel;
use Monolog\LogRecord;
/**
* Error level based activation strategy.
*
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
*
* @phpstan-import-type Level from \Monolog\Logger
* @phpstan-import-type LevelName from \Monolog\Logger
*/
class ErrorLevelActivationStrategy implements ActivationStrategyInterface
{
/**
* @var Level
*/
private $actionLevel;
private Level $actionLevel;
/**
* @param int|string $actionLevel Level or name or value
* @param int|string|Level|LevelName $actionLevel Level or name or value
*
* @phpstan-param Level|LevelName|LogLevel::* $actionLevel
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $actionLevel
*/
public function __construct($actionLevel)
public function __construct(int|string|Level|LevelName $actionLevel)
{
$this->actionLevel = Logger::toMonologLevel($actionLevel);
}
public function isHandlerActivated(LogRecord $record): bool
{
return $record->level >= $this->actionLevel;
return $record->level->value >= $this->actionLevel->value;
}
}

View File

@@ -13,6 +13,8 @@ namespace Monolog\Handler;
use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy;
use Monolog\Handler\FingersCrossed\ActivationStrategyInterface;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\Logger;
use Monolog\ResettableInterface;
use Monolog\Formatter\FormatterInterface;
@@ -34,8 +36,6 @@ use Monolog\LogRecord;
* Monolog\Handler\FingersCrossed\ namespace.
*
* @author Jordi Boggiano <j.boggiano@seld.be>
* @phpstan-import-type Level from \Monolog\Logger
* @phpstan-import-type LevelName from \Monolog\Logger
*/
class FingersCrossedHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface
{
@@ -56,11 +56,7 @@ class FingersCrossedHandler extends Handler implements ProcessableHandlerInterfa
protected $buffer = [];
/** @var bool */
protected $stopBuffering;
/**
* @var ?int
* @phpstan-var ?Level
*/
protected $passthruLevel;
protected Level|null $passthruLevel = null;
/** @var bool */
protected $bubble;
@@ -68,19 +64,19 @@ class FingersCrossedHandler extends Handler implements ProcessableHandlerInterfa
* @phpstan-param (callable(LogRecord|null, HandlerInterface): HandlerInterface)|HandlerInterface $handler
*
* @param callable|HandlerInterface $handler Handler or factory callable($record|null, $fingersCrossedHandler).
* @param int|string|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action, or a level name/value at which the handler is activated
* @param int|string|Level|LevelName|LogLevel::* $activationStrategy Strategy which determines when this handler takes action, or a level name/value at which the handler is activated
* @param int $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
* @param bool $bubble Whether the messages that are handled can bubble up the stack or not
* @param bool $stopBuffering Whether the handler should stop buffering after being triggered (default true)
* @param int|string $passthruLevel Minimum level to always flush to handler on close, even if strategy not triggered
* @param int|string|Level|LevelName|LogLevel::* $passthruLevel Minimum level to always flush to handler on close, even if strategy not triggered
*
* @phpstan-param Level|LevelName|LogLevel::* $passthruLevel
* @phpstan-param Level|LevelName|LogLevel::*|ActivationStrategyInterface $activationStrategy
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::*|ActivationStrategyInterface $activationStrategy
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $passthruLevel
*/
public function __construct($handler, $activationStrategy = null, int $bufferSize = 0, bool $bubble = true, bool $stopBuffering = true, $passthruLevel = null)
public function __construct($handler, int|string|Level|LevelName|ActivationStrategyInterface $activationStrategy = null, int $bufferSize = 0, bool $bubble = true, bool $stopBuffering = true, int|string|Level|LevelName $passthruLevel = null)
{
if (null === $activationStrategy) {
$activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING);
$activationStrategy = new ErrorLevelActivationStrategy(Level::Warning);
}
// convert simple int activationStrategy to an object

View File

@@ -13,7 +13,7 @@ namespace Monolog\Handler;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\LineFormatter;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LogRecord;
/**
@@ -46,7 +46,7 @@ class FleepHookHandler extends SocketHandler
*/
public function __construct(
string $token,
$level = Logger::DEBUG,
$level = Level::Debug,
bool $bubble = true,
bool $persistent = false,
float $timeout = 0.0,

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\Formatter\FlowdockFormatter;
use Monolog\Formatter\FormatterInterface;
@@ -40,7 +40,7 @@ class FlowdockHandler extends SocketHandler
*/
public function __construct(
string $apiToken,
$level = Logger::DEBUG,
$level = Level::Debug,
bool $bubble = true,
bool $persistent = false,
float $timeout = 0.0,

View File

@@ -12,7 +12,7 @@
namespace Monolog\Handler;
use Gelf\PublisherInterface;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Formatter\GelfMessageFormatter;
use Monolog\Formatter\FormatterInterface;
use Monolog\LogRecord;
@@ -33,7 +33,7 @@ class GelfHandler extends AbstractProcessingHandler
/**
* @param PublisherInterface $publisher a gelf publisher object
*/
public function __construct(PublisherInterface $publisher, $level = Logger::DEBUG, bool $bubble = true)
public function __construct(PublisherInterface $publisher, $level = Level::Debug, bool $bubble = true)
{
parent::__construct($level, $bubble);

View File

@@ -17,8 +17,6 @@ use Monolog\LogRecord;
* Interface that all Monolog Handlers must implement
*
* @author Jordi Boggiano <j.boggiano@seld.be>
*
* @phpstan-import-type Level from \Monolog\Logger
*/
interface HandlerInterface
{

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\LogRecord;
@@ -37,7 +37,7 @@ class IFTTTHandler extends AbstractProcessingHandler
* @param string $eventName The name of the IFTTT Maker event that should be triggered
* @param string $secretKey A valid IFTTT secret key
*/
public function __construct(string $eventName, string $secretKey, $level = Logger::ERROR, bool $bubble = true)
public function __construct(string $eventName, string $secretKey, $level = Level::Error, bool $bubble = true)
{
if (!extension_loaded('curl')) {
throw new MissingExtensionException('The curl extension is needed to use the IFTTTHandler');

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LogRecord;
/**
@@ -38,7 +38,7 @@ class InsightOpsHandler extends SocketHandler
string $token,
string $region = 'us',
bool $useSSL = true,
$level = Logger::DEBUG,
$level = Level::Debug,
bool $bubble = true,
bool $persistent = false,
float $timeout = 0.0,

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LogRecord;
/**
@@ -34,7 +34,7 @@ class LogEntriesHandler extends SocketHandler
public function __construct(
string $token,
bool $useSSL = true,
$level = Logger::DEBUG,
$level = Level::Debug,
bool $bubble = true,
string $host = 'data.logentries.com',
bool $persistent = false,

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\LogglyFormatter;
use function array_key_exists;
@@ -49,7 +49,7 @@ class LogglyHandler extends AbstractProcessingHandler
*
* @throws MissingExtensionException If the curl extension is missing
*/
public function __construct(string $token, $level = Logger::DEBUG, bool $bubble = true)
public function __construct(string $token, $level = Level::Debug, bool $bubble = true)
{
if (!extension_loaded('curl')) {
throw new MissingExtensionException('The curl extension is needed to use the LogglyHandler');

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\LogmaticFormatter;
use Monolog\LogRecord;
@@ -49,7 +49,7 @@ class LogmaticHandler extends SocketHandler
string $hostname = '',
string $appname = '',
bool $useSSL = true,
$level = Logger::DEBUG,
$level = Level::Debug,
bool $bubble = true,
bool $persistent = false,
float $timeout = 0.0,

View File

@@ -30,7 +30,7 @@ abstract class MailHandler extends AbstractProcessingHandler
$messages = [];
foreach ($records as $record) {
if ($record->level < $this->level) {
if ($record->level->isLowerThan($this->level)) {
continue;
}
@@ -68,7 +68,7 @@ abstract class MailHandler extends AbstractProcessingHandler
{
$highestRecord = null;
foreach ($records as $record) {
if ($highestRecord === null || $highestRecord['level'] < $record->level) {
if ($highestRecord === null || $record->level->isHigherThan($highestRecord->level)) {
$highestRecord = $record;
}
}

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Swift;
use Swift_Message;
@@ -33,7 +33,7 @@ class MandrillHandler extends MailHandler
* @param string $apiKey A valid Mandrill API key
* @param callable|Swift_Message $message An example message for real messages, only the body will be replaced
*/
public function __construct(string $apiKey, $message, $level = Logger::ERROR, bool $bubble = true)
public function __construct(string $apiKey, $message, $level = Level::Error, bool $bubble = true)
{
parent::__construct($level, $bubble);

View File

@@ -14,7 +14,7 @@ namespace Monolog\Handler;
use MongoDB\Driver\BulkWrite;
use MongoDB\Driver\Manager;
use MongoDB\Client;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\MongoDBFormatter;
use Monolog\LogRecord;
@@ -47,7 +47,7 @@ class MongoDBHandler extends AbstractProcessingHandler
* @param string $database Database name
* @param string $collection Collection name
*/
public function __construct($mongodb, string $database, string $collection, $level = Logger::DEBUG, bool $bubble = true)
public function __construct($mongodb, string $database, string $collection, $level = Level::Debug, bool $bubble = true)
{
if (!($mongodb instanceof Client || $mongodb instanceof Manager)) {
throw new \InvalidArgumentException('MongoDB\Client or MongoDB\Driver\Manager instance required');

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Formatter\LineFormatter;
/**
@@ -70,7 +70,7 @@ class NativeMailerHandler extends MailHandler
* @param string $from The sender of the mail
* @param int $maxColumnWidth The maximum column width that the message lines will have
*/
public function __construct($to, string $subject, string $from, $level = Logger::ERROR, bool $bubble = true, int $maxColumnWidth = 70)
public function __construct($to, string $subject, string $from, $level = Level::Error, bool $bubble = true, int $maxColumnWidth = 70)
{
parent::__construct($level, $bubble);
$this->to = (array) $to;

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\Formatter\NormalizerFormatter;
use Monolog\Formatter\FormatterInterface;
@@ -58,7 +58,7 @@ class NewRelicHandler extends AbstractProcessingHandler
* @param string|null $transactionName
*/
public function __construct(
$level = Logger::ERROR,
$level = Level::Error,
bool $bubble = true,
?string $appName = null,
bool $explodeArrays = false,

View File

@@ -11,8 +11,10 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LevelName;
use Psr\Log\LogLevel;
use Monolog\Logger;
use Monolog\LogRecord;
/**
@@ -22,23 +24,17 @@ use Monolog\LogRecord;
* to put on top of an existing stack to override it temporarily.
*
* @author Jordi Boggiano <j.boggiano@seld.be>
*
* @phpstan-import-type Level from \Monolog\Logger
* @phpstan-import-type LevelName from \Monolog\Logger
*/
class NullHandler extends Handler
{
/**
* @var int
*/
private $level;
private Level $level;
/**
* @param string|int $level The minimum logging level at which this handler will be triggered
* @param string|int|Level|LevelName $level The minimum logging level at which this handler will be triggered
*
* @phpstan-param Level|LevelName|LogLevel::* $level
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $level
*/
public function __construct($level = Logger::DEBUG)
public function __construct(string|int|Level|LevelName $level = Level::Debug)
{
$this->level = Logger::toMonologLevel($level);
}
@@ -48,7 +44,7 @@ class NullHandler extends Handler
*/
public function isHandling(LogRecord $record): bool
{
return $record->level >= $this->level;
return $record->level->value >= $this->level->value;
}
/**
@@ -56,6 +52,6 @@ class NullHandler extends Handler
*/
public function handle(LogRecord $record): bool
{
return $record->level >= $this->level;
return $record->level->value >= $this->level->value;
}
}

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Formatter\FormatterInterface;
use Monolog\LogRecord;
@@ -28,7 +28,7 @@ use Monolog\LogRecord;
* $handler = new SomeHandler(...)
*
* // Pass all warnings to the handler when more than 10 & all error messages when more then 5
* $overflow = new OverflowHandler($handler, [Logger::WARNING => 10, Logger::ERROR => 5]);
* $overflow = new OverflowHandler($handler, [Level::Warning->value => 10, Level::Error->value => 5]);
*
* $log->pushHandler($overflow);
*```
@@ -40,17 +40,8 @@ class OverflowHandler extends AbstractHandler implements FormattableHandlerInter
/** @var HandlerInterface */
private $handler;
/** @var int[] */
private $thresholdMap = [
Logger::DEBUG => 0,
Logger::INFO => 0,
Logger::NOTICE => 0,
Logger::WARNING => 0,
Logger::ERROR => 0,
Logger::CRITICAL => 0,
Logger::ALERT => 0,
Logger::EMERGENCY => 0,
];
/** @var array<int, int> */
private $thresholdMap = [];
/**
* Buffer of all messages passed to the handler before the threshold was reached
@@ -61,12 +52,12 @@ class OverflowHandler extends AbstractHandler implements FormattableHandlerInter
/**
* @param HandlerInterface $handler
* @param int[] $thresholdMap Dictionary of logger level => threshold
* @param array<int, int> $thresholdMap Dictionary of log level value => threshold
*/
public function __construct(
HandlerInterface $handler,
array $thresholdMap = [],
$level = Logger::DEBUG,
$level = Level::Debug,
bool $bubble = true
) {
$this->handler = $handler;
@@ -90,11 +81,11 @@ class OverflowHandler extends AbstractHandler implements FormattableHandlerInter
*/
public function handle(LogRecord $record): bool
{
if ($record->level < $this->level) {
if ($record->level->isLowerThan($this->level)) {
return false;
}
$level = $record->level;
$level = $record->level->value;
if (!isset($this->thresholdMap[$level])) {
$this->thresholdMap[$level] = 0;

View File

@@ -13,7 +13,7 @@ namespace Monolog\Handler;
use Monolog\Formatter\LineFormatter;
use Monolog\Formatter\FormatterInterface;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use PhpConsole\Connector;
use PhpConsole\Handler as VendorPhpConsoleHandler;
@@ -73,7 +73,7 @@ class PHPConsoleHandler extends AbstractProcessingHandler
* @param Connector|null $connector Instance of \PhpConsole\Connector class (optional)
* @throws \RuntimeException
*/
public function __construct(array $options = [], ?Connector $connector = null, $level = Logger::DEBUG, bool $bubble = true)
public function __construct(array $options = [], ?Connector $connector = null, $level = Level::Debug, bool $bubble = true)
{
if (!class_exists('PhpConsole\Connector')) {
throw new \RuntimeException('PHP Console library not found. See https://github.com/barbushin/php-console#installation');
@@ -180,7 +180,7 @@ class PHPConsoleHandler extends AbstractProcessingHandler
*/
protected function write(LogRecord $record): void
{
if ($record->level < Logger::NOTICE) {
if ($record->level->isLowerThan(Level::Notice)) {
$this->handleDebugRecord($record);
} elseif (isset($record->context['exception']) && $record->context['exception'] instanceof \Throwable) {
$this->handleExceptionRecord($record);
@@ -239,7 +239,7 @@ class PHPConsoleHandler extends AbstractProcessingHandler
}
}
return [$tags ?: strtolower($record->levelName), $filteredContext];
return [$tags ?: strtolower($record->levelName->value), $filteredContext];
}
/**

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LogRecord;
/**
@@ -64,7 +64,7 @@ class ProcessHandler extends AbstractProcessingHandler
* @param string|null $cwd "Current working directory" (CWD) for the process to be executed in.
* @throws \InvalidArgumentException
*/
public function __construct(string $command, $level = Logger::DEBUG, bool $bubble = true, ?string $cwd = null)
public function __construct(string $command, $level = Level::Debug, bool $bubble = true, ?string $cwd = null)
{
if ($command === '') {
throw new \InvalidArgumentException('The command argument must be a non-empty string.');

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Psr\Log\LoggerInterface;
use Monolog\Formatter\FormatterInterface;
use Monolog\LogRecord;
@@ -42,7 +42,7 @@ class PsrHandler extends AbstractHandler implements FormattableHandlerInterface
/**
* @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied
*/
public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, bool $bubble = true)
public function __construct(LoggerInterface $logger, $level = Level::Debug, bool $bubble = true)
{
parent::__construct($level, $bubble);
@@ -60,9 +60,9 @@ class PsrHandler extends AbstractHandler implements FormattableHandlerInterface
if ($this->formatter) {
$formatted = $this->formatter->format($record);
$this->logger->log(strtolower($record->levelName), (string) $formatted, $record->context);
$this->logger->log(strtolower($record->levelName->value), (string) $formatted, $record->context);
} else {
$this->logger->log(strtolower($record->levelName), $record->message, $record->context);
$this->logger->log(strtolower($record->levelName->value), $record->message, $record->context);
}
return false === $this->bubble;

View File

@@ -11,6 +11,8 @@
namespace Monolog\Handler;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\Logger;
use Monolog\Utils;
use Psr\Log\LogLevel;
@@ -21,9 +23,6 @@ use Monolog\LogRecord;
*
* @author Sebastian Göttschkes <sebastian.goettschkes@googlemail.com>
* @see https://www.pushover.net/api
*
* @phpstan-import-type Level from \Monolog\Logger
* @phpstan-import-type LevelName from \Monolog\Logger
*/
class PushoverHandler extends SocketHandler
{
@@ -40,10 +39,8 @@ class PushoverHandler extends SocketHandler
/** @var int */
private $expire;
/** @var int */
private $highPriorityLevel;
/** @var int */
private $emergencyLevel;
private Level $highPriorityLevel;
private Level $emergencyLevel;
/** @var bool */
private $useFormattedMessage = false;
@@ -85,28 +82,30 @@ class PushoverHandler extends SocketHandler
* @param string|null $title Title sent to the Pushover API
* @param bool $useSSL Whether to connect via SSL. Required when pushing messages to users that are not
* the pushover.net app owner. OpenSSL is required for this option.
* @param string|int $highPriorityLevel The minimum logging level at which this handler will start
* sending "high priority" requests to the Pushover API
* @param string|int $emergencyLevel The minimum logging level at which this handler will start
* sending "emergency" requests to the Pushover API
* @param int $retry The retry parameter specifies how often (in seconds) the Pushover servers will
* send the same notification to the user.
* @param int $expire The expire parameter specifies how many seconds your notification will continue
* to be retried for (every retry seconds).
*
* @param int|string|Level|LevelName|LogLevel::* $highPriorityLevel The minimum logging level at which this handler will start
* sending "high priority" requests to the Pushover API
* @param int|string|Level|LevelName|LogLevel::* $emergencyLevel The minimum logging level at which this handler will start
* sending "emergency" requests to the Pushover API
*
*
* @phpstan-param string|array<int|string> $users
* @phpstan-param Level|LevelName|LogLevel::* $highPriorityLevel
* @phpstan-param Level|LevelName|LogLevel::* $emergencyLevel
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $highPriorityLevel
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $emergencyLevel
*/
public function __construct(
string $token,
$users,
?string $title = null,
$level = Logger::CRITICAL,
int|string|Level|LevelName $level = Level::Critical,
bool $bubble = true,
bool $useSSL = true,
$highPriorityLevel = Logger::CRITICAL,
$emergencyLevel = Logger::EMERGENCY,
int|string|Level|LevelName $highPriorityLevel = Level::Critical,
int|string|Level|LevelName $emergencyLevel = Level::Emergency,
int $retry = 30,
int $expire = 25200,
bool $persistent = false,
@@ -161,11 +160,11 @@ class PushoverHandler extends SocketHandler
'timestamp' => $timestamp,
];
if (isset($record->level) && $record->level >= $this->emergencyLevel) {
if ($record->level->value >= $this->emergencyLevel->value) {
$dataArray['priority'] = 2;
$dataArray['retry'] = $this->retry;
$dataArray['expire'] = $this->expire;
} elseif (isset($record->level) && $record->level >= $this->highPriorityLevel) {
} elseif ($record->level->value >= $this->highPriorityLevel->value) {
$dataArray['priority'] = 1;
}
@@ -208,25 +207,25 @@ class PushoverHandler extends SocketHandler
}
/**
* @param int|string $value
* @param int|string|Level|LevelName|LogLevel::* $level
*
* @phpstan-param Level|LevelName|LogLevel::* $value
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $level
*/
public function setHighPriorityLevel($value): self
public function setHighPriorityLevel(int|string|Level|LevelName $level): self
{
$this->highPriorityLevel = Logger::toMonologLevel($value);
$this->highPriorityLevel = Logger::toMonologLevel($level);
return $this;
}
/**
* @param int|string $value
* @param int|string|Level|LevelName|LogLevel::* $level
*
* @phpstan-param Level|LevelName|LogLevel::* $value
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $level
*/
public function setEmergencyLevel($value): self
public function setEmergencyLevel(int|string|Level|LevelName $level): self
{
$this->emergencyLevel = Logger::toMonologLevel($value);
$this->emergencyLevel = Logger::toMonologLevel($level);
return $this;
}
@@ -234,9 +233,9 @@ class PushoverHandler extends SocketHandler
/**
* Use the formatted message?
*/
public function useFormattedMessage(bool $value): self
public function useFormattedMessage(bool $useFormattedMessage): self
{
$this->useFormattedMessage = $value;
$this->useFormattedMessage = $useFormattedMessage;
return $this;
}

View File

@@ -13,7 +13,7 @@ namespace Monolog\Handler;
use Monolog\Formatter\LineFormatter;
use Monolog\Formatter\FormatterInterface;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LogRecord;
/**
@@ -41,7 +41,7 @@ class RedisHandler extends AbstractProcessingHandler
* @param string $key The key name to push records to
* @param int $capSize Number of entries to limit list size to, 0 = unlimited
*/
public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true, int $capSize = 0)
public function __construct($redis, string $key, $level = Level::Debug, bool $bubble = true, int $capSize = 0)
{
if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) {
throw new \InvalidArgumentException('Predis\Client or Redis instance required');

View File

@@ -13,7 +13,7 @@ namespace Monolog\Handler;
use Monolog\Formatter\LineFormatter;
use Monolog\Formatter\FormatterInterface;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LogRecord;
/**
@@ -22,7 +22,7 @@ use Monolog\LogRecord;
* usage example:
*
* $log = new Logger('application');
* $redis = new RedisPubSubHandler(new Predis\Client("tcp://localhost:6379"), "logs", Logger::WARNING);
* $redis = new RedisPubSubHandler(new Predis\Client("tcp://localhost:6379"), "logs", Level::Warning);
* $log->pushHandler($redis);
*
* @author Gaëtan Faugère <gaetan@fauge.re>
@@ -38,7 +38,7 @@ class RedisPubSubHandler extends AbstractProcessingHandler
* @param \Predis\Client<\Predis\Client>|\Redis $redis The redis instance
* @param string $key The channel key to publish records to
*/
public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true)
public function __construct($redis, string $key, $level = Level::Debug, bool $bubble = true)
{
if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) {
throw new \InvalidArgumentException('Predis\Client or Redis instance required');

View File

@@ -11,9 +11,10 @@
namespace Monolog\Handler;
use Monolog\Level;
use Monolog\LevelName;
use Rollbar\RollbarLogger;
use Throwable;
use Monolog\Logger;
use Monolog\LogRecord;
/**
@@ -39,18 +40,6 @@ class RollbarHandler extends AbstractProcessingHandler
*/
protected $rollbarLogger;
/** @var string[] */
protected $levelMap = [
Logger::DEBUG => 'debug',
Logger::INFO => 'info',
Logger::NOTICE => 'info',
Logger::WARNING => 'warning',
Logger::ERROR => 'error',
Logger::CRITICAL => 'critical',
Logger::ALERT => 'critical',
Logger::EMERGENCY => 'critical',
];
/**
* Records whether any log records have been added since the last flush of the rollbar notifier
*
@@ -64,13 +53,32 @@ class RollbarHandler extends AbstractProcessingHandler
/**
* @param RollbarLogger $rollbarLogger RollbarLogger object constructed with valid token
*/
public function __construct(RollbarLogger $rollbarLogger, $level = Logger::ERROR, bool $bubble = true)
public function __construct(RollbarLogger $rollbarLogger, int|string|Level|LevelName $level = Level::Error, bool $bubble = true)
{
$this->rollbarLogger = $rollbarLogger;
parent::__construct($level, $bubble);
}
/**
* Translates Monolog log levels to Rollbar levels.
*
* @return 'debug'|'info'|'warning'|'error'|'critical'
*/
protected function toRollbarLevel(Level $level): string
{
return match ($level) {
Level::Debug => 'debug',
Level::Info => 'info',
Level::Notice => 'info',
Level::Warning => 'warning',
Level::Error => 'error',
Level::Critical => 'critical',
Level::Alert => 'critical',
Level::Emergency => 'critical',
};
}
/**
* {@inheritDoc}
*/
@@ -84,7 +92,7 @@ class RollbarHandler extends AbstractProcessingHandler
$context = $record->context;
$context = array_merge($context, $record->extra, [
'level' => $this->levelMap[$record->level],
'level' => $this->toRollbarLevel($record->level),
'monolog_level' => $record->levelName,
'channel' => $record->channel,
'datetime' => $record->datetime->format('U'),

View File

@@ -12,7 +12,7 @@
namespace Monolog\Handler;
use InvalidArgumentException;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\LogRecord;
@@ -50,7 +50,7 @@ class RotatingFileHandler extends StreamHandler
* @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write)
* @param bool $useLocking Try to lock log file before doing any writes
*/
public function __construct(string $filename, int $maxFiles = 0, $level = Logger::DEBUG, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false)
public function __construct(string $filename, int $maxFiles = 0, $level = Level::Debug, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false)
{
$this->filename = Utils::canonicalizePath($filename);
$this->maxFiles = $maxFiles;

View File

@@ -27,7 +27,6 @@ use Monolog\LogRecord;
*
* @author Bryan Davis <bd808@wikimedia.org>
* @author Kunal Mehta <legoktm@gmail.com>
* @phpstan-import-type Level from \Monolog\Logger
*/
class SamplingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface
{

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
/**
* SendGridrHandler uses the SendGrid API v2 function to send Log emails, more information in https://sendgrid.com/docs/API_Reference/Web_API/mail.html
@@ -57,7 +57,7 @@ class SendGridHandler extends MailHandler
* @param string|string[] $to The recipients of the email
* @param string $subject The subject of the mail
*/
public function __construct(string $apiUser, string $apiKey, string $from, $to, string $subject, $level = Logger::ERROR, bool $bubble = true)
public function __construct(string $apiUser, string $apiKey, string $from, $to, string $subject, $level = Level::Error, bool $bubble = true)
{
if (!extension_loaded('curl')) {
throw new MissingExtensionException('The curl extension is needed to use the SendGridHandler');

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler\Slack;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\Formatter\NormalizerFormatter;
use Monolog\Formatter\FormatterInterface;
@@ -145,7 +145,7 @@ class SlackRecord
$attachment = array(
'fallback' => $message,
'text' => $message,
'color' => $this->getAttachmentColor($recordData['level']),
'color' => $this->getAttachmentColor($record->level),
'fields' => array(),
'mrkdwn_in' => array('fields'),
'ts' => $recordData['datetime']->getTimestamp(),
@@ -201,18 +201,14 @@ class SlackRecord
* Returns a Slack message attachment color associated with
* provided level.
*/
public function getAttachmentColor(int $level): string
public function getAttachmentColor(Level $level): string
{
switch (true) {
case $level >= Logger::ERROR:
return static::COLOR_DANGER;
case $level >= Logger::WARNING:
return static::COLOR_WARNING;
case $level >= Logger::INFO:
return static::COLOR_GOOD;
default:
return static::COLOR_DEFAULT;
}
return match ($level) {
Level::Error, Level::Critical, Level::Alert, Level::Emergency => static::COLOR_DANGER,
Level::Warning => static::COLOR_WARNING,
Level::Info, Level::Notice => static::COLOR_GOOD,
Level::Debug => static::COLOR_DEFAULT
};
}
/**

View File

@@ -12,7 +12,7 @@
namespace Monolog\Handler;
use Monolog\Formatter\FormatterInterface;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\Handler\Slack\SlackRecord;
use Monolog\LogRecord;
@@ -54,7 +54,7 @@ class SlackHandler extends SocketHandler
?string $username = null,
bool $useAttachment = true,
?string $iconEmoji = null,
$level = Logger::CRITICAL,
$level = Level::Critical,
bool $bubble = true,
bool $useShortAttachment = false,
bool $includeContextAndExtra = false,

View File

@@ -12,7 +12,7 @@
namespace Monolog\Handler;
use Monolog\Formatter\FormatterInterface;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\Handler\Slack\SlackRecord;
use Monolog\LogRecord;
@@ -55,7 +55,7 @@ class SlackWebhookHandler extends AbstractProcessingHandler
?string $iconEmoji = null,
bool $useShortAttachment = false,
bool $includeContextAndExtra = false,
$level = Logger::CRITICAL,
$level = Level::Critical,
bool $bubble = true,
array $excludeFields = array()
) {

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LogRecord;
/**
@@ -58,7 +58,7 @@ class SocketHandler extends AbstractProcessingHandler
*/
public function __construct(
string $connectionString,
$level = Logger::DEBUG,
$level = Level::Debug,
bool $bubble = true,
bool $persistent = false,
float $timeout = 0.0,

View File

@@ -12,7 +12,7 @@
namespace Monolog\Handler;
use Aws\Sqs\SqsClient;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\LogRecord;
@@ -33,7 +33,7 @@ class SqsHandler extends AbstractProcessingHandler
/** @var string */
private $queueUrl;
public function __construct(SqsClient $sqsClient, string $queueUrl, $level = Logger::DEBUG, bool $bubble = true)
public function __construct(SqsClient $sqsClient, string $queueUrl, $level = Level::Debug, bool $bubble = true)
{
parent::__construct($level, $bubble);

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\LogRecord;
@@ -50,7 +50,7 @@ class StreamHandler extends AbstractProcessingHandler
*
* @throws \InvalidArgumentException If stream is not a resource or string
*/
public function __construct($stream, $level = Logger::DEBUG, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false)
public function __construct($stream, $level = Level::Debug, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false)
{
parent::__construct($level, $bubble);

View File

@@ -11,7 +11,7 @@
namespace Monolog\Handler;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\LogRecord;
@@ -40,7 +40,7 @@ class SyslogHandler extends AbstractSyslogHandler
* @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant
* @param int $logopts Option flags for the openlog() call, defaults to LOG_PID
*/
public function __construct(string $ident, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, int $logopts = LOG_PID)
public function __construct(string $ident, $facility = LOG_USER, $level = Level::Debug, bool $bubble = true, int $logopts = LOG_PID)
{
parent::__construct($facility, $level, $bubble);
@@ -64,6 +64,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($this->logLevels[$record->level], (string) $record->formatted);
syslog($this->toSyslogPriority($record->level), (string) $record->formatted);
}
}

View File

@@ -12,7 +12,7 @@
namespace Monolog\Handler;
use DateTimeInterface;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Handler\SyslogUdp\UdpSocket;
use Monolog\Utils;
use Monolog\LogRecord;
@@ -54,7 +54,7 @@ class SyslogUdpHandler extends AbstractSyslogHandler
*
* @phpstan-param self::RFC* $rfc
*/
public function __construct(string $host, int $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, string $ident = 'php', int $rfc = self::RFC5424)
public function __construct(string $host, int $port = 514, $facility = LOG_USER, $level = Level::Debug, bool $bubble = true, string $ident = 'php', int $rfc = self::RFC5424)
{
if (!extension_loaded('sockets')) {
throw new MissingExtensionException('The sockets extension is required to use the SyslogUdpHandler');
@@ -72,7 +72,7 @@ class SyslogUdpHandler extends AbstractSyslogHandler
{
$lines = $this->splitMessageIntoLines($record->formatted);
$header = $this->makeCommonSyslogHeader($this->logLevels[$record->level], $record->datetime);
$header = $this->makeCommonSyslogHeader($this->toSyslogPriority($record->level), $record->datetime);
foreach ($lines as $line) {
$this->socket->write($line, $header);

View File

@@ -12,7 +12,7 @@
namespace Monolog\Handler;
use RuntimeException;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Utils;
use Monolog\LogRecord;
@@ -105,7 +105,7 @@ class TelegramBotHandler extends AbstractProcessingHandler
public function __construct(
string $apiKey,
string $channel,
$level = Logger::DEBUG,
$level = Level::Debug,
bool $bubble = true,
string $parseMode = null,
bool $disableWebPagePreview = null,

View File

@@ -11,10 +11,11 @@
namespace Monolog\Handler;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\Logger;
use Psr\Log\LogLevel;
use Monolog\LogRecord;
use Monolog\DateTimeImmutable;
/**
* Used for testing purposes.
@@ -67,16 +68,13 @@ use Monolog\DateTimeImmutable;
* @method bool hasNoticeThatPasses($message)
* @method bool hasInfoThatPasses($message)
* @method bool hasDebugThatPasses($message)
*
* @phpstan-import-type Level from \Monolog\Logger
* @phpstan-import-type LevelName from \Monolog\Logger
*/
class TestHandler extends AbstractProcessingHandler
{
/** @var LogRecord[] */
protected $records = [];
/** @var array<Level, LogRecord[]> */
protected $recordsByLevel = [];
/** @phpstan-var array<value-of<Level::VALUES>, LogRecord[]> */
protected array $recordsByLevel = [];
/** @var bool */
private $skipReset = false;
@@ -116,23 +114,21 @@ class TestHandler extends AbstractProcessingHandler
}
/**
* @param string|int $level Logging level value or name
* @param int|string|Level|LevelName|LogLevel::* $level Logging level value or name
*
* @phpstan-param Level|LevelName|LogLevel::* $level
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $level
*/
public function hasRecords($level): bool
public function hasRecords(int|string|Level|LevelName $level): bool
{
return isset($this->recordsByLevel[Logger::toMonologLevel($level)]);
return isset($this->recordsByLevel[Logger::toMonologLevel($level)->value]);
}
/**
* @param string|array $recordAssertions Either a message string or an array containing message and optionally context keys that will be checked against all records
* @param string|int $level Logging level value or name
*
* @phpstan-param array{message: string, context?: mixed[]}|string $recordAssertions
* @phpstan-param Level|LevelName|LogLevel::* $level
*/
public function hasRecord(string|array $recordAssertions, $level): bool
public function hasRecord(string|array $recordAssertions, Level $level): bool
{
if (is_string($recordAssertions)) {
$recordAssertions = ['message' => $recordAssertions];
@@ -150,42 +146,28 @@ class TestHandler extends AbstractProcessingHandler
}, $level);
}
/**
* @param string|int $level Logging level value or name
*
* @phpstan-param Level|LevelName|LogLevel::* $level
*/
public function hasRecordThatContains(string $message, $level): bool
public function hasRecordThatContains(string $message, Level $level): bool
{
return $this->hasRecordThatPasses(fn (LogRecord $rec) => str_contains($rec->message, $message), $level);
}
/**
* @param string|int $level Logging level value or name
*
* @phpstan-param Level|LevelName|LogLevel::* $level
*/
public function hasRecordThatMatches(string $regex, $level): bool
public function hasRecordThatMatches(string $regex, Level $level): bool
{
return $this->hasRecordThatPasses(fn (LogRecord $rec) => preg_match($regex, $rec->message) > 0, $level);
}
/**
* @param string|int $level Logging level value or name
* @return bool
*
* @phpstan-param callable(LogRecord, int): mixed $predicate
* @phpstan-param Level|LevelName|LogLevel::* $level
*/
public function hasRecordThatPasses(callable $predicate, $level)
public function hasRecordThatPasses(callable $predicate, Level $level): bool
{
$level = Logger::toMonologLevel($level);
if (!isset($this->recordsByLevel[$level])) {
if (!isset($this->recordsByLevel[$level->value])) {
return false;
}
foreach ($this->recordsByLevel[$level] as $i => $rec) {
foreach ($this->recordsByLevel[$level->value] as $i => $rec) {
if ($predicate($rec, $i)) {
return true;
}
@@ -199,7 +181,7 @@ class TestHandler extends AbstractProcessingHandler
*/
protected function write(LogRecord $record): void
{
$this->recordsByLevel[$record->level][] = $record;
$this->recordsByLevel[$record->level->value][] = $record;
$this->records[] = $record;
}
@@ -212,11 +194,10 @@ class TestHandler extends AbstractProcessingHandler
{
if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) {
$genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3];
$level = constant('Monolog\Logger::' . strtoupper($matches[2]));
$level = constant(Level::class.'::' . $matches[2]);
$callback = [$this, $genericMethod];
if (is_callable($callback)) {
$args[] = $level;
return call_user_func_array($callback, $args);
}
}

View File

@@ -13,7 +13,7 @@ namespace Monolog\Handler;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\NormalizerFormatter;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LogRecord;
/**
@@ -24,47 +24,48 @@ use Monolog\LogRecord;
*/
class ZendMonitorHandler extends AbstractProcessingHandler
{
/**
* Monolog level / ZendMonitor Custom Event priority map
*
* @var array<int, int>
*/
protected $levelMap = [];
/**
* @throws MissingExtensionException
*/
public function __construct($level = Logger::DEBUG, bool $bubble = true)
public function __construct($level = Level::Debug, bool $bubble = true)
{
if (!function_exists('zend_monitor_custom_event')) {
throw new MissingExtensionException(
'You must have Zend Server installed with Zend Monitor enabled in order to use this handler'
);
}
//zend monitor constants are not defined if zend monitor is not enabled.
$this->levelMap = [
Logger::DEBUG => \ZEND_MONITOR_EVENT_SEVERITY_INFO,
Logger::INFO => \ZEND_MONITOR_EVENT_SEVERITY_INFO,
Logger::NOTICE => \ZEND_MONITOR_EVENT_SEVERITY_INFO,
Logger::WARNING => \ZEND_MONITOR_EVENT_SEVERITY_WARNING,
Logger::ERROR => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
Logger::CRITICAL => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
Logger::ALERT => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
Logger::EMERGENCY => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
];
parent::__construct($level, $bubble);
}
/**
* Translates Monolog log levels to ZendMonitor levels.
*/
protected function toZendMonitorLevel(Level $level): int
{
return match ($level) {
Level::Debug => \ZEND_MONITOR_EVENT_SEVERITY_INFO,
Level::Info => \ZEND_MONITOR_EVENT_SEVERITY_INFO,
Level::Notice => \ZEND_MONITOR_EVENT_SEVERITY_INFO,
Level::Warning => \ZEND_MONITOR_EVENT_SEVERITY_WARNING,
Level::Error => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
Level::Critical => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
Level::Alert => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
Level::Emergency => \ZEND_MONITOR_EVENT_SEVERITY_ERROR,
};
}
/**
* {@inheritDoc}
*/
protected function write(LogRecord $record): void
{
$this->writeZendMonitorCustomEvent(
Logger::getLevelName($record->level),
$record->level->toLevelName()->value,
$record->message,
$record->formatted,
$this->levelMap[$record->level]
$this->toZendMonitorLevel($record->level)
);
}
@@ -87,12 +88,4 @@ class ZendMonitorHandler extends AbstractProcessingHandler
{
return new NormalizerFormatter();
}
/**
* @return array<int, int>
*/
public function getLevelMap(): array
{
return $this->levelMap;
}
}

127
src/Monolog/Level.php Normal file
View File

@@ -0,0 +1,127 @@
<?php
namespace Monolog;
use Psr\Log\LogLevel;
/**
* @see LevelName
*/
enum Level: int
{
/**
* Detailed debug information
*/
case Debug = 100;
/**
* Interesting events
*
* Examples: User logs in, SQL logs.
*/
case Info = 200;
/**
* Uncommon events
*/
case Notice = 250;
/**
* Exceptional occurrences that are not errors
*
* Examples: Use of deprecated APIs, poor use of an API,
* undesirable things that are not necessarily wrong.
*/
case Warning = 300;
/**
* Runtime errors
*/
case Error = 400;
/**
* Critical conditions
*
* Example: Application component unavailable, unexpected exception.
*/
case Critical = 500;
/**
* Action must be taken immediately
*
* Example: Entire website down, database unavailable, etc.
* This should trigger the SMS alerts and wake you up.
*/
case Alert = 550;
/**
* Urgent alert.
*/
case Emergency = 600;
public static function fromLevelName(LevelName $name): self
{
return match ($name) {
LevelName::Debug => self::Debug,
LevelName::Info => self::Info,
LevelName::Notice => self::Notice,
LevelName::Warning => self::Warning,
LevelName::Error => self::Error,
LevelName::Critical => self::Critical,
LevelName::Alert => self::Alert,
LevelName::Emergency => self::Emergency,
};
}
/**
* Returns true if the passed $level is higher or equal to $this
*/
public function includes(Level $level): bool
{
return $this->value <= $level->value;
}
public function isHigherThan(Level $level): bool
{
return $this->value > $level->value;
}
public function isLowerThan(Level $level): bool
{
return $this->value < $level->value;
}
public function toLevelName(): LevelName
{
return LevelName::fromLevel($this);
}
/**
* @return string
* @phpstan-return \Psr\Log\LogLevel::*
*/
public function toPsrLogLevel(): string
{
return match ($this) {
self::Debug => LogLevel::DEBUG,
self::Info => LogLevel::INFO,
self::Notice => LogLevel::NOTICE,
self::Warning => LogLevel::WARNING,
self::Error => LogLevel::ERROR,
self::Critical => LogLevel::CRITICAL,
self::Alert => LogLevel::ALERT,
self::Emergency => LogLevel::EMERGENCY,
};
}
public const VALUES = [
100,
200,
250,
300,
400,
500,
550,
600,
];
}

53
src/Monolog/LevelName.php Normal file
View File

@@ -0,0 +1,53 @@
<?php
namespace Monolog;
/**
* @see Level
*/
enum LevelName: string
{
case Debug = 'DEBUG';
case Info = 'INFO';
case Notice = 'NOTICE';
case Warning = 'WARNING';
case Error = 'ERROR';
case Critical = 'CRITICAL';
case Alert = 'ALERT';
case Emergency = 'EMERGENCY';
public static function fromLevel(Level $level): self
{
return match ($level) {
Level::Debug => self::Debug,
Level::Info => self::Info,
Level::Notice => self::Notice,
Level::Warning => self::Warning,
Level::Error => self::Error,
Level::Critical => self::Critical,
Level::Alert => self::Alert,
Level::Emergency => self::Emergency,
};
}
public function toLevel(): Level
{
return Level::fromLevelName($this);
}
public const VALUES = [
'DEBUG',
'INFO',
'NOTICE',
'WARNING',
'ERROR',
'CRITICAL',
'ALERT',
'EMERGENCY',
];
public function jsonSerialize(): mixed
{
return $this->value;
}
}

View File

@@ -17,25 +17,21 @@ use ArrayAccess;
* Monolog log record
*
* @author Jordi Boggiano <j.boggiano@seld.be>
* @template-implements \ArrayAccess<'message'|'level'|'context'|'level_name'|'channel'|'datetime'|'extra', int|string|\DateTimeImmutable|array<mixed>>
* @phpstan-import-type Level from Logger
* @phpstan-import-type LevelName from Logger
* @template-implements ArrayAccess<'message'|'level'|'context'|'level_name'|'channel'|'datetime'|'extra', int|string|\DateTimeImmutable|array<mixed>>
*/
class LogRecord implements \ArrayAccess
class LogRecord implements ArrayAccess
{
private const MODIFIABLE_FIELDS = [
'extra' => true,
'formatted' => true,
];
/** @var 'DEBUG'|'INFO'|'NOTICE'|'WARNING'|'ERROR'|'CRITICAL'|'ALERT'|'EMERGENCY' */
public readonly string $levelName; // TODO enum?
public readonly LevelName $levelName;
public function __construct(
public readonly \DateTimeImmutable $datetime,
public readonly string $channel,
/** @var Logger::DEBUG|Logger::INFO|Logger::NOTICE|Logger::WARNING|Logger::ERROR|Logger::CRITICAL|Logger::ALERT|Logger::EMERGENCY */
public readonly int $level, // TODO enum?
public readonly Level $level,
public readonly string $message,
/** @var array<mixed> */
public readonly array $context = [],
@@ -43,7 +39,7 @@ class LogRecord implements \ArrayAccess
public array $extra = [],
public mixed $formatted = null,
) {
$this->levelName = Logger::getLevelName($level);
$this->levelName = LevelName::fromLevel($level);
}
public function offsetSet(mixed $offset, mixed $value): void
@@ -81,8 +77,15 @@ class LogRecord implements \ArrayAccess
public function &offsetGet(mixed $offset): mixed
{
if ($offset === 'level_name') {
$offset = 'levelName';
if ($offset === 'level_name' || $offset === 'level') {
if ($offset === 'level_name') {
$offset = 'levelName';
}
// avoid returning readonly props by ref as this is illegal
$copy = $this->{$offset}->value;
return $copy;
}
if (isset(self::MODIFIABLE_FIELDS[$offset])) {
@@ -96,15 +99,15 @@ class LogRecord implements \ArrayAccess
}
/**
* @phpstan-return array{message: string, context: mixed[], level: Level, level_name: LevelName, channel: string, datetime: \DateTimeImmutable, extra: mixed[]}
* @phpstan-return array{message: string, context: mixed[], level: value-of<Level::VALUES>, level_name: value-of<LevelName::VALUES>, channel: string, datetime: \DateTimeImmutable, extra: mixed[]}
*/
public function toArray(): array
{
return [
'message' => $this->message,
'context' => $this->context,
'level' => $this->level,
'level_name' => $this->levelName,
'level' => $this->level->value,
'level_name' => $this->levelName->value,
'channel' => $this->channel,
'datetime' => $this->datetime,
'extra' => $this->extra,

View File

@@ -27,14 +27,13 @@ use Stringable;
* and uses them to store records that are added to it.
*
* @author Jordi Boggiano <j.boggiano@seld.be>
*
* @phpstan-type Level Logger::DEBUG|Logger::INFO|Logger::NOTICE|Logger::WARNING|Logger::ERROR|Logger::CRITICAL|Logger::ALERT|Logger::EMERGENCY
* @phpstan-type LevelName 'DEBUG'|'INFO'|'NOTICE'|'WARNING'|'ERROR'|'CRITICAL'|'ALERT'|'EMERGENCY'
*/
class Logger implements LoggerInterface, ResettableInterface
{
/**
* Detailed debug information
*
* @deprecated Use \Monolog\Level::Debug
*/
public const DEBUG = 100;
@@ -42,11 +41,15 @@ class Logger implements LoggerInterface, ResettableInterface
* Interesting events
*
* Examples: User logs in, SQL logs.
*
* @deprecated Use \Monolog\Level::Info
*/
public const INFO = 200;
/**
* Uncommon events
*
* @deprecated Use \Monolog\Level::Notice
*/
public const NOTICE = 250;
@@ -55,11 +58,15 @@ class Logger implements LoggerInterface, ResettableInterface
*
* Examples: Use of deprecated APIs, poor use of an API,
* undesirable things that are not necessarily wrong.
*
* @deprecated Use \Monolog\Level::Warning
*/
public const WARNING = 300;
/**
* Runtime errors
*
* @deprecated Use \Monolog\Level::Error
*/
public const ERROR = 400;
@@ -67,6 +74,8 @@ class Logger implements LoggerInterface, ResettableInterface
* Critical conditions
*
* Example: Application component unavailable, unexpected exception.
*
* @deprecated Use \Monolog\Level::Critical
*/
public const CRITICAL = 500;
@@ -75,11 +84,15 @@ class Logger implements LoggerInterface, ResettableInterface
*
* Example: Entire website down, database unavailable, etc.
* This should trigger the SMS alerts and wake you up.
*
* @deprecated Use \Monolog\Level::Alert
*/
public const ALERT = 550;
/**
* Urgent alert.
*
* @deprecated Use \Monolog\Level::Emergency
*/
public const EMERGENCY = 600;
@@ -91,25 +104,7 @@ class Logger implements LoggerInterface, ResettableInterface
*
* @var int
*/
public const API = 2;
/**
* This is a static variable and not a constant to serve as an extension point for custom levels
*
* @var array<int, string> $levels Logging levels with the levels as key
*
* @phpstan-var array<Level, LevelName> $levels Logging levels with the levels as key
*/
protected static $levels = [
self::DEBUG => 'DEBUG',
self::INFO => 'INFO',
self::NOTICE => 'NOTICE',
self::WARNING => 'WARNING',
self::ERROR => 'ERROR',
self::CRITICAL => 'CRITICAL',
self::ALERT => 'ALERT',
self::EMERGENCY => 'EMERGENCY',
];
public const API = 3;
/**
* @var string
@@ -287,16 +282,16 @@ class Logger implements LoggerInterface, ResettableInterface
* @param mixed[] $context The log context
* @return bool Whether the record has been processed
*
* @phpstan-param Level $level
* @phpstan-param value-of<Level::VALUES>|Level $level
*/
public function addRecord(int $level, string $message, array $context = []): bool
public function addRecord(int|Level $level, string $message, array $context = []): bool
{
$recordInitialized = count($this->processors) === 0;
$record = new LogRecord(
message: $message,
context: $context,
level: $level,
level: self::toMonologLevel($level),
channel: $this->name,
datetime: new DateTimeImmutable($this->microsecondTimestamps, $this->timezone),
extra: [],
@@ -380,79 +375,64 @@ class Logger implements LoggerInterface, ResettableInterface
}
}
/**
* Gets all supported logging levels.
*
* @return array<string, int> Assoc array with human-readable level names => level codes.
* @phpstan-return array<LevelName, Level>
*/
public static function getLevels(): array
{
return array_flip(static::$levels);
}
/**
* Gets the name of the logging level.
*
* @throws \Psr\Log\InvalidArgumentException If level is not defined
*
* @phpstan-param Level $level
* @phpstan-return LevelName
*/
public static function getLevelName(int $level): string
{
if (!isset(static::$levels[$level])) {
throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels)));
}
return static::$levels[$level];
}
/**
* Converts PSR-3 levels to Monolog ones if necessary
*
* @param string|int $level Level number (monolog) or name (PSR-3)
* @param int|string|Level|LevelName|LogLevel::* $level Level number (monolog) or name (PSR-3)
* @throws \Psr\Log\InvalidArgumentException If level is not defined
*
* @phpstan-param Level|LevelName|LogLevel::* $level
* @phpstan-return Level
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $level
*/
public static function toMonologLevel($level): int
public static function toMonologLevel(string|int|Level|LevelName $level): Level
{
if (is_string($level)) {
if (is_numeric($level)) {
return intval($level);
if ($level instanceof Level) {
return $level;
}
if ($level instanceof LevelName) {
return $level->toLevel();
}
if (\is_string($level)) {
if (\is_numeric($level)) {
$levelEnum = Level::tryFrom((int) $level);
if ($levelEnum === null) {
throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', LevelName::VALUES + Level::VALUES));
}
return $levelEnum;
}
// Contains chars of all log levels and avoids using strtoupper() which may have
// Contains first char of all log levels and avoids using strtoupper() which may have
// strange results depending on locale (for example, "i" will become "İ" in Turkish locale)
$upper = strtr($level, 'abcdefgilmnortuwy', 'ABCDEFGILMNORTUWY');
if (defined(__CLASS__.'::'.$upper)) {
return constant(__CLASS__ . '::' . $upper);
$upper = strtr(substr($level, 0, 1), 'dinweca', 'DINWECA') . strtolower(substr($level, 1));
if (defined(Level::class.'::'.$upper)) {
return constant(Level::class . '::' . $upper);
}
throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels) + static::$levels));
throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', LevelName::VALUES + Level::VALUES));
}
if (!is_int($level)) {
throw new InvalidArgumentException('Level "'.var_export($level, true).'" is not defined, use one of: '.implode(', ', array_keys(static::$levels) + static::$levels));
$levelEnum = Level::tryFrom($level);
if ($levelEnum === null) {
throw new InvalidArgumentException('Level "'.var_export($level, true).'" is not defined, use one of: '.implode(', ', LevelName::VALUES + Level::VALUES));
}
return $level;
return $levelEnum;
}
/**
* Checks whether the Logger has a handler that listens on the given level
*
* @phpstan-param Level $level
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $level
*/
public function isHandling(int $level): bool
public function isHandling(int|string|LevelName|Level $level): bool
{
$record = new LogRecord(
datetime: new DateTimeImmutable($this->microsecondTimestamps, $this->timezone),
channel: $this->name,
message: '',
level: $level,
level: self::toMonologLevel($level),
);
foreach ($this->handlers as $handler) {
@@ -494,8 +474,8 @@ class Logger implements LoggerInterface, ResettableInterface
*/
public function log($level, string|\Stringable $message, array $context = []): void
{
if (!is_int($level) && !is_string($level)) {
throw new \InvalidArgumentException('$level is expected to be a string or int');
if (!is_string($level) && !is_int($level) && !$level instanceof Level) {
throw new \InvalidArgumentException('$level is expected to be a string, int or '.Level::class.' instance');
}
$level = static::toMonologLevel($level);

View File

@@ -11,6 +11,8 @@
namespace Monolog\Processor;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\Logger;
use Psr\Log\LogLevel;
use Monolog\LogRecord;
@@ -20,23 +22,19 @@ use Monolog\LogRecord;
*
* @author Nick Otter
* @author Jordi Boggiano <j.boggiano@seld.be>
*
* @phpstan-import-type Level from \Monolog\Logger
* @phpstan-import-type LevelName from \Monolog\Logger
*/
class GitProcessor implements ProcessorInterface
{
/** @var int */
private $level;
private Level $level;
/** @var array{branch: string, commit: string}|array<never>|null */
private static $cache = null;
/**
* @param string|int $level The minimum logging level at which this Processor will be triggered
* @param int|string|Level|LevelName|LogLevel::* $level The minimum logging level at which this Processor will be triggered
*
* @phpstan-param Level|LevelName|LogLevel::* $level
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $level
*/
public function __construct($level = Logger::DEBUG)
public function __construct(int|string|Level|LevelName $level = Level::Debug)
{
$this->level = Logger::toMonologLevel($level);
}

View File

@@ -11,6 +11,8 @@
namespace Monolog\Processor;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\Logger;
use Psr\Log\LogLevel;
use Monolog\LogRecord;
@@ -25,13 +27,10 @@ use Monolog\LogRecord;
* triggered the FingersCrossedHandler.
*
* @author Jordi Boggiano <j.boggiano@seld.be>
*
* @phpstan-import-type Level from \Monolog\Logger
* @phpstan-import-type LevelName from \Monolog\Logger
*/
class IntrospectionProcessor implements ProcessorInterface
{
private int $level;
private Level $level;
/** @var string[] */
private array $skipClassesPartials;
@@ -44,12 +43,12 @@ class IntrospectionProcessor implements ProcessorInterface
];
/**
* @param string|int $level The minimum logging level at which this Processor will be triggered
* @param string|int|Level|LevelName $level The minimum logging level at which this Processor will be triggered
* @param string[] $skipClassesPartials
*
* @phpstan-param Level|LevelName|LogLevel::* $level
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $level
*/
public function __construct($level = Logger::DEBUG, array $skipClassesPartials = [], int $skipStackFramesCount = 0)
public function __construct(int|string|Level|LevelName $level = Level::Debug, array $skipClassesPartials = [], int $skipStackFramesCount = 0)
{
$this->level = Logger::toMonologLevel($level);
$this->skipClassesPartials = array_merge(['Monolog\\'], $skipClassesPartials);
@@ -62,7 +61,7 @@ class IntrospectionProcessor implements ProcessorInterface
public function __invoke(LogRecord $record): LogRecord
{
// return if the level is not high enough
if ($record->level < $this->level) {
if ($record->level->isLowerThan($this->level)) {
return $record;
}

View File

@@ -11,6 +11,8 @@
namespace Monolog\Processor;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\Logger;
use Psr\Log\LogLevel;
use Monolog\LogRecord;
@@ -19,23 +21,19 @@ use Monolog\LogRecord;
* Injects Hg branch and Hg revision number in all records
*
* @author Jonathan A. Schweder <jonathanschweder@gmail.com>
*
* @phpstan-import-type LevelName from \Monolog\Logger
* @phpstan-import-type Level from \Monolog\Logger
*/
class MercurialProcessor implements ProcessorInterface
{
/** @var Level */
private $level;
private Level $level;
/** @var array{branch: string, revision: string}|array<never>|null */
private static $cache = null;
/**
* @param int|string $level The minimum logging level at which this Processor will be triggered
* @param int|string|Level|LevelName $level The minimum logging level at which this Processor will be triggered
*
* @phpstan-param Level|LevelName|LogLevel::* $level
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $level
*/
public function __construct($level = Logger::DEBUG)
public function __construct(int|string|Level|LevelName $level = Level::Debug)
{
$this->level = Logger::toMonologLevel($level);
}
@@ -46,7 +44,7 @@ class MercurialProcessor implements ProcessorInterface
public function __invoke(LogRecord $record): LogRecord
{
// return if the level is not high enough
if ($record->level < $this->level) {
if ($record->level->isLowerThan($this->level)) {
return $record;
}

View File

@@ -19,9 +19,6 @@ use ReflectionExtension;
* Monolog POSIX signal handler
*
* @author Robert Gust-Bardon <robert@gust-bardon.org>
*
* @phpstan-import-type Level from \Monolog\Logger
* @phpstan-import-type LevelName from \Monolog\Logger
*/
class SignalHandler
{
@@ -30,7 +27,7 @@ class SignalHandler
/** @var array<int, callable|string|int> SIG_DFL, SIG_IGN or previous callable */
private $previousSignalHandler = [];
/** @var array<int, int> */
/** @var array<int, \Psr\Log\LogLevel::*> */
private $signalLevelMap = [];
/** @var array<int, bool> */
private $signalRestartSyscalls = [];
@@ -41,21 +38,21 @@ class SignalHandler
}
/**
* @param int|string $level Level or level name
* @param int|string|Level|LevelName $level Level or level name
* @param bool $callPrevious
* @param bool $restartSyscalls
* @param bool|null $async
* @return $this
*
* @phpstan-param Level|LevelName|LogLevel::* $level
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $level
*/
public function registerSignalHandler(int $signo, $level = LogLevel::CRITICAL, bool $callPrevious = true, bool $restartSyscalls = true, ?bool $async = true): self
public function registerSignalHandler(int $signo, int|string|Level|LevelName $level = LogLevel::CRITICAL, bool $callPrevious = true, bool $restartSyscalls = true, ?bool $async = true): self
{
if (!extension_loaded('pcntl') || !function_exists('pcntl_signal')) {
return $this;
}
$level = Logger::toMonologLevel($level);
$level = Logger::toMonologLevel($level)->toPsrLogLevel();
if ($callPrevious) {
$handler = pcntl_signal_get_handler($signo);

View File

@@ -11,17 +11,18 @@
namespace Monolog\Test;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\Logger;
use Monolog\LogRecord;
use Monolog\DateTimeImmutable;
use Monolog\Formatter\FormatterInterface;
use Psr\Log\LogLevel;
/**
* Lets you easily generate log records and a dummy formatter for testing purposes
*
* @author Jordi Boggiano <j.boggiano@seld.be>
*
* @phpstan-import-type Level from \Monolog\Logger
*/
class TestCase extends \PHPUnit\Framework\TestCase
{
@@ -29,14 +30,14 @@ class TestCase extends \PHPUnit\Framework\TestCase
* @param array<mixed> $context
* @param array<mixed> $extra
*
* @phpstan-param Level $level
* @phpstan-param value-of<Level::VALUES>|value-of<LevelName::VALUES>|Level|LevelName|LogLevel::* $level
*/
protected function getRecord(int $level = Logger::WARNING, string|\Stringable $message = 'test', array $context = [], string $channel = 'test', \DateTimeImmutable $datetime = new DateTimeImmutable(true), array $extra = []): LogRecord
protected function getRecord(int|string|LevelName|Level $level = Level::Warning, string|\Stringable $message = 'test', array $context = [], string $channel = 'test', \DateTimeImmutable $datetime = new DateTimeImmutable(true), array $extra = []): LogRecord
{
return new LogRecord(
message: (string) $message,
context: $context,
level: $level,
level: Logger::toMonologLevel($level),
channel: $channel,
datetime: $datetime,
extra: $extra,
@@ -49,11 +50,11 @@ class TestCase extends \PHPUnit\Framework\TestCase
protected function getMultipleRecords(): array
{
return [
$this->getRecord(Logger::DEBUG, 'debug message 1'),
$this->getRecord(Logger::DEBUG, 'debug message 2'),
$this->getRecord(Logger::INFO, 'information'),
$this->getRecord(Logger::WARNING, 'warning'),
$this->getRecord(Logger::ERROR, 'error'),
$this->getRecord(Level::Debug, 'debug message 1'),
$this->getRecord(Level::Debug, 'debug message 2'),
$this->getRecord(Level::Info, 'information'),
$this->getRecord(Level::Warning, 'warning'),
$this->getRecord(Level::Error, 'error'),
];
}

View File

@@ -37,7 +37,7 @@ class ErrorHandlerTest extends \PHPUnit\Framework\TestCase
$this->assertTrue(is_callable($prop));
$this->assertSame($prevHandler, $prop);
$resHandler = $errHandler->registerErrorHandler([E_USER_NOTICE => Logger::EMERGENCY], false);
$resHandler = $errHandler->registerErrorHandler([E_USER_NOTICE => LogLevel::EMERGENCY], false);
$this->assertSame($errHandler, $resHandler);
trigger_error('Foo', E_USER_ERROR);
$this->assertCount(1, $handler->getRecords());

View File

@@ -11,7 +11,7 @@
namespace Monolog\Formatter;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Test\TestCase;
class ChromePHPFormatterTest extends TestCase
@@ -23,7 +23,7 @@ class ChromePHPFormatterTest extends TestCase
{
$formatter = new ChromePHPFormatter();
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['from' => 'logger'],
@@ -55,7 +55,7 @@ class ChromePHPFormatterTest extends TestCase
{
$formatter = new ChromePHPFormatter();
$record = $this->getRecord(
Logger::CRITICAL,
Level::Critical,
'log',
channel: 'meh',
context: ['from' => 'logger'],
@@ -87,7 +87,7 @@ class ChromePHPFormatterTest extends TestCase
{
$formatter = new ChromePHPFormatter();
$record = $this->getRecord(
Logger::DEBUG,
Level::Debug,
'log',
channel: 'meh',
datetime: new \DateTimeImmutable("@0"),
@@ -114,13 +114,13 @@ class ChromePHPFormatterTest extends TestCase
$formatter = new ChromePHPFormatter();
$records = [
$this->getRecord(
Logger::INFO,
Level::Info,
'log',
channel: 'meh',
datetime: new \DateTimeImmutable("@0"),
),
$this->getRecord(
Logger::WARNING,
Level::Warning,
'log2',
channel: 'foo',
datetime: new \DateTimeImmutable("@0"),

View File

@@ -11,7 +11,7 @@
namespace Monolog\Formatter;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LogRecord;
use Monolog\Test\TestCase;
@@ -33,7 +33,7 @@ class ElasticaFormatterTest extends TestCase
{
// test log message
$msg = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['foo' => 7, 'bar', 'class' => new \stdClass],

View File

@@ -11,7 +11,7 @@
namespace Monolog\Formatter;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Test\TestCase;
class ElasticsearchFormatterTest extends TestCase
@@ -25,7 +25,7 @@ class ElasticsearchFormatterTest extends TestCase
{
// Test log message
$msg = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['foo' => 7, 'bar', 'class' => new \stdClass],

View File

@@ -11,7 +11,7 @@
namespace Monolog\Formatter;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Test\TestCase;
class FlowdockFormatterTest extends TestCase
@@ -44,8 +44,8 @@ class FlowdockFormatterTest extends TestCase
{
$formatter = new FlowdockFormatter('test_source', 'source@test.com');
$records = [
$this->getRecord(Logger::WARNING),
$this->getRecord(Logger::DEBUG),
$this->getRecord(Level::Warning),
$this->getRecord(Level::Debug),
];
$formatted = $formatter->formatBatch($records);

View File

@@ -11,7 +11,7 @@
namespace Monolog\Formatter;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Test\TestCase;
class FluentdFormatterTest extends TestCase
@@ -35,7 +35,7 @@ class FluentdFormatterTest extends TestCase
*/
public function testFormat()
{
$record = $this->getRecord(Logger::WARNING, datetime: new \DateTimeImmutable("@0"));
$record = $this->getRecord(Level::Warning, datetime: new \DateTimeImmutable("@0"));
$formatter = new FluentdFormatter();
$this->assertEquals(
@@ -49,7 +49,7 @@ class FluentdFormatterTest extends TestCase
*/
public function testFormatWithTag()
{
$record = $this->getRecord(Logger::ERROR, datetime: new \DateTimeImmutable("@0"));
$record = $this->getRecord(Level::Error, datetime: new \DateTimeImmutable("@0"));
$formatter = new FluentdFormatter(true);
$this->assertEquals(

View File

@@ -11,7 +11,7 @@
namespace Monolog\Formatter;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Test\TestCase;
class GelfMessageFormatterTest extends TestCase
@@ -30,7 +30,7 @@ class GelfMessageFormatterTest extends TestCase
{
$formatter = new GelfMessageFormatter();
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
datetime: new \DateTimeImmutable("@0"),
@@ -62,7 +62,7 @@ class GelfMessageFormatterTest extends TestCase
{
$formatter = new GelfMessageFormatter();
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['from' => 'logger'],
@@ -84,7 +84,7 @@ class GelfMessageFormatterTest extends TestCase
{
$formatter = new GelfMessageFormatter();
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['from' => 'logger'],
@@ -120,7 +120,7 @@ class GelfMessageFormatterTest extends TestCase
{
$formatter = new GelfMessageFormatter();
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['from' => 'logger', 'exception' => [
@@ -146,7 +146,7 @@ class GelfMessageFormatterTest extends TestCase
{
$formatter = new GelfMessageFormatter();
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['from' => 'logger'],
@@ -179,7 +179,7 @@ class GelfMessageFormatterTest extends TestCase
{
$formatter = new GelfMessageFormatter();
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['exception' => str_repeat(' ', 32767)],
@@ -205,7 +205,7 @@ class GelfMessageFormatterTest extends TestCase
{
$formatter = new GelfMessageFormatter('LONG_SYSTEM_NAME', null, 'ctxt_', PHP_INT_MAX);
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['exception' => str_repeat(' ', 32767 * 2)],
@@ -231,7 +231,7 @@ class GelfMessageFormatterTest extends TestCase
{
$formatter = new GelfMessageFormatter();
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
str_repeat('в', 32767),
channel: 'meh',
context: ['exception' => str_repeat('а', 32767)],

View File

@@ -11,7 +11,7 @@
namespace Monolog\Formatter;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LogRecord;
use Monolog\Test\TestCase;
@@ -85,8 +85,8 @@ class JsonFormatterTest extends TestCase
{
$formatter = new JsonFormatter();
$records = [
$this->getRecord(Logger::WARNING),
$this->getRecord(Logger::DEBUG),
$this->getRecord(Level::Warning),
$this->getRecord(Level::Debug),
];
$this->assertEquals(json_encode($records), $formatter->formatBatch($records));
}
@@ -99,8 +99,8 @@ class JsonFormatterTest extends TestCase
{
$formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES);
$records = [
$this->getRecord(Logger::WARNING),
$this->getRecord(Logger::DEBUG),
$this->getRecord(Level::Warning),
$this->getRecord(Level::Debug),
];
$expected = array_map(fn (LogRecord $record) => json_encode($record->toArray(), JSON_FORCE_OBJECT), $records);
$this->assertEquals(implode("\n", $expected), $formatter->formatBatch($records));
@@ -213,7 +213,7 @@ class JsonFormatterTest extends TestCase
private function formatRecordWithExceptionInContext(JsonFormatter $formatter, \Throwable $exception)
{
$message = $formatter->format($this->getRecord(
Logger::CRITICAL,
Level::Critical,
'foobar',
channel: 'core',
context: ['exception' => $exception],
@@ -262,7 +262,7 @@ class JsonFormatterTest extends TestCase
$largeArray = range(1, 1000);
$res = $formatter->format($this->getRecord(
Logger::CRITICAL,
Level::Critical,
'bar',
channel: 'test',
context: array($largeArray),
@@ -278,7 +278,7 @@ class JsonFormatterTest extends TestCase
$largeArray = range(1, 2000);
$res = $formatter->format($this->getRecord(
Logger::CRITICAL,
Level::Critical,
'bar',
channel: 'test',
context: array($largeArray),
@@ -293,7 +293,7 @@ class JsonFormatterTest extends TestCase
$formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, true, true);
$record = $formatter->format($this->getRecord(
Logger::DEBUG,
Level::Debug,
'Testing',
channel: 'test',
datetime: new \DateTimeImmutable('2022-02-22 00:00:00'),

View File

@@ -12,7 +12,7 @@
namespace Monolog\Formatter;
use Monolog\Test\TestCase;
use Monolog\Logger;
use Monolog\Level;
/**
* @covers Monolog\Formatter\LineFormatter
@@ -23,7 +23,7 @@ class LineFormatterTest extends TestCase
{
$formatter = new LineFormatter(null, 'Y-m-d');
$message = $formatter->format($this->getRecord(
Logger::WARNING,
Level::Warning,
'foo',
channel: 'log',
));
@@ -34,7 +34,7 @@ class LineFormatterTest extends TestCase
{
$formatter = new LineFormatter(null, 'Y-m-d');
$message = $formatter->format($this->getRecord(
Logger::ERROR,
Level::Error,
'foo',
channel: 'meh',
context: [
@@ -51,7 +51,7 @@ class LineFormatterTest extends TestCase
{
$formatter = new LineFormatter(null, 'Y-m-d');
$message = $formatter->format($this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
extra: ['ip' => '127.0.0.1'],
@@ -63,7 +63,7 @@ class LineFormatterTest extends TestCase
{
$formatter = new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context% %extra.file% %extra%\n", 'Y-m-d');
$message = $formatter->format($this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
extra: ['ip' => '127.0.0.1', 'file' => 'test'],
@@ -75,7 +75,7 @@ class LineFormatterTest extends TestCase
{
$formatter = new LineFormatter(null, 'Y-m-d', false, true);
$message = $formatter->format($this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
));
@@ -86,7 +86,7 @@ class LineFormatterTest extends TestCase
{
$formatter = new LineFormatter('%context.foo% => %extra.foo%');
$message = $formatter->format($this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['foo' => 'bar'],
@@ -100,7 +100,7 @@ class LineFormatterTest extends TestCase
{
$formatter = new LineFormatter(null, 'Y-m-d');
$message = $formatter->format($this->getRecord(
Logger::ERROR,
Level::Error,
'foobar',
channel: 'meh',
context: [],
@@ -114,7 +114,7 @@ class LineFormatterTest extends TestCase
{
$formatter = new LineFormatter(null, 'Y-m-d');
$message = $formatter->format($this->getRecord(
Logger::CRITICAL,
Level::Critical,
'foobar',
channel: 'core',
context: ['exception' => new \RuntimeException('Foo')],
@@ -130,7 +130,7 @@ class LineFormatterTest extends TestCase
$formatter = new LineFormatter(null, 'Y-m-d');
$formatter->includeStacktraces();
$message = $formatter->format($this->getRecord(
Logger::CRITICAL,
Level::Critical,
'foobar',
channel: 'core',
context: ['exception' => new \RuntimeException('Foo')],
@@ -146,7 +146,7 @@ class LineFormatterTest extends TestCase
$formatter = new LineFormatter(null, 'Y-m-d');
$previous = new \LogicException('Wut?');
$message = $formatter->format($this->getRecord(
Logger::CRITICAL,
Level::Critical,
'foobar',
channel: 'core',
context: ['exception' => new \RuntimeException('Foo', 0, $previous)],
@@ -165,7 +165,7 @@ class LineFormatterTest extends TestCase
$formatter = new LineFormatter(null, 'Y-m-d');
$message = $formatter->format($this->getRecord(
Logger::CRITICAL,
Level::Critical,
'foobar',
channel: 'core',
context: ['exception' => new \SoapFault('foo', 'bar', 'hello', 'world')],
@@ -176,7 +176,7 @@ class LineFormatterTest extends TestCase
$this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (SoapFault(code: 0 faultcode: foo faultactor: hello detail: world): bar at '.substr($path, 1, -1).':'.(__LINE__ - 5).')"} []'."\n", $message);
$message = $formatter->format($this->getRecord(
Logger::CRITICAL,
Level::Critical,
'foobar',
channel: 'core',
context: ['exception' => new \SoapFault('foo', 'bar', 'hello', (object) ['bar' => (object) ['biz' => 'baz'], 'foo' => 'world'])],
@@ -192,12 +192,12 @@ class LineFormatterTest extends TestCase
$formatter = new LineFormatter(null, 'Y-m-d');
$message = $formatter->formatBatch([
$this->getRecord(
Logger::CRITICAL,
Level::Critical,
'bar',
channel: 'test',
),
$this->getRecord(
Logger::WARNING,
Level::Warning,
'foo',
channel: 'log',
),

View File

@@ -11,7 +11,8 @@
namespace Monolog\Formatter;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\Test\TestCase;
class LogstashFormatterTest extends TestCase
@@ -23,7 +24,7 @@ class LogstashFormatterTest extends TestCase
{
$formatter = new LogstashFormatter('test', 'hostname');
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
datetime: new \DateTimeImmutable("@0"),
@@ -35,8 +36,8 @@ class LogstashFormatterTest extends TestCase
$this->assertEquals("1", $message['@version']);
$this->assertEquals('log', $message['message']);
$this->assertEquals('meh', $message['channel']);
$this->assertEquals('ERROR', $message['level']);
$this->assertEquals(Logger::ERROR, $message['monolog_level']);
$this->assertEquals(LevelName::Error->value, $message['level']);
$this->assertEquals(Level::Error->value, $message['monolog_level']);
$this->assertEquals('test', $message['type']);
$this->assertEquals('hostname', $message['host']);
@@ -54,7 +55,7 @@ class LogstashFormatterTest extends TestCase
{
$formatter = new LogstashFormatter('test');
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['from' => 'logger'],
@@ -75,7 +76,7 @@ class LogstashFormatterTest extends TestCase
{
$formatter = new LogstashFormatter('test');
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['from' => 'logger'],
@@ -105,7 +106,7 @@ class LogstashFormatterTest extends TestCase
{
$formatter = new LogstashFormatter('test');
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['from' => 'logger'],
@@ -132,7 +133,7 @@ class LogstashFormatterTest extends TestCase
{
$formatter = new LogstashFormatter('app', 'test');
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['from' => 'logger'],
@@ -150,7 +151,7 @@ class LogstashFormatterTest extends TestCase
{
$formatter = new LogstashFormatter('test', 'hostname');
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: '¯\_(ツ)_/¯',
datetime: new \DateTimeImmutable("@0"),

View File

@@ -14,7 +14,8 @@ namespace Monolog\Formatter;
use MongoDB\BSON\ObjectId;
use MongoDB\BSON\Regex;
use MongoDB\BSON\UTCDateTime;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LevelName;
use Monolog\Test\TestCase;
/**
@@ -62,7 +63,7 @@ class MongoDBFormatterTest extends TestCase
{
$record = $this->getRecord(
message: 'some log message',
level: Logger::WARNING,
level: Level::Warning,
channel: 'test',
datetime: new \DateTimeImmutable('2016-01-21T21:11:30.123456+00:00'),
);
@@ -73,8 +74,8 @@ class MongoDBFormatterTest extends TestCase
$this->assertCount(7, $formattedRecord);
$this->assertEquals('some log message', $formattedRecord['message']);
$this->assertEquals([], $formattedRecord['context']);
$this->assertEquals(Logger::WARNING, $formattedRecord['level']);
$this->assertEquals(Logger::getLevelName(Logger::WARNING), $formattedRecord['level_name']);
$this->assertEquals(Level::Warning->value, $formattedRecord['level']);
$this->assertEquals(LevelName::Warning->value, $formattedRecord['level_name']);
$this->assertEquals('test', $formattedRecord['channel']);
$this->assertInstanceOf('MongoDB\BSON\UTCDateTime', $formattedRecord['datetime']);
$this->assertEquals('1453410690123', $formattedRecord['datetime']->__toString());
@@ -96,7 +97,7 @@ class MongoDBFormatterTest extends TestCase
'context_int' => 123456,
'except' => new \Exception('exception message', 987),
],
level: Logger::WARNING,
level: Level::Warning,
channel: 'test',
datetime: new \DateTimeImmutable('2016-01-21T21:11:30.213000+00:00'),
);
@@ -140,7 +141,7 @@ class MongoDBFormatterTest extends TestCase
],
],
],
level: Logger::WARNING,
level: Level::Warning,
channel: 'test',
datetime: new \DateTimeImmutable('2016-01-21T21:11:30.123456+00:00'),
);
@@ -174,7 +175,7 @@ class MongoDBFormatterTest extends TestCase
],
],
],
level: Logger::WARNING,
level: Level::Warning,
channel: 'test',
datetime: new \DateTimeImmutable('2016-01-21T21:11:30.123456+00:00'),
);
@@ -211,7 +212,7 @@ class MongoDBFormatterTest extends TestCase
context: [
'nest2' => $someObject,
],
level: Logger::WARNING,
level: Level::Warning,
channel: 'test',
datetime: new \DateTimeImmutable('2016-01-21T21:11:30.123456+00:00'),
);
@@ -238,7 +239,7 @@ class MongoDBFormatterTest extends TestCase
context: [
'nest2' => new \Exception('exception message', 987),
],
level: Logger::WARNING,
level: Level::Warning,
channel: 'test',
datetime: new \DateTimeImmutable('2016-01-21T21:11:30.123456+00:00'),
);
@@ -262,7 +263,7 @@ class MongoDBFormatterTest extends TestCase
'regex' => new Regex('pattern'),
],
],
level: Logger::WARNING,
level: Level::Warning,
channel: 'test',
datetime: new \DateTimeImmutable('2016-01-21T21:11:30.123456+00:00'),
);

View File

@@ -11,8 +11,9 @@
namespace Monolog\Formatter;
use Monolog\LevelName;
use Monolog\Test\TestCase;
use Monolog\Logger;
use Monolog\Level;
/**
* @covers Monolog\Formatter\NormalizerFormatter
@@ -23,7 +24,7 @@ class NormalizerFormatterTest extends TestCase
{
$formatter = new NormalizerFormatter('Y-m-d');
$formatted = $formatter->format($this->getRecord(
Logger::ERROR,
Level::Error,
'foo',
channel: 'meh',
extra: ['foo' => new TestFooNorm, 'bar' => new TestBarNorm, 'baz' => [], 'res' => fopen('php://memory', 'rb')],
@@ -37,8 +38,8 @@ class NormalizerFormatterTest extends TestCase
));
$this->assertEquals([
'level_name' => 'ERROR',
'level' => Logger::ERROR,
'level_name' => LevelName::Error->value,
'level' => Level::Error->value,
'channel' => 'meh',
'message' => 'foo',
'datetime' => date('Y-m-d'),
@@ -142,13 +143,13 @@ class NormalizerFormatterTest extends TestCase
{
$formatter = new NormalizerFormatter('Y-m-d');
$formatted = $formatter->formatBatch([
$this->getRecord(Logger::CRITICAL, 'bar', channel: 'test'),
$this->getRecord(Logger::WARNING, 'foo', channel: 'log'),
$this->getRecord(Level::Critical, 'bar', channel: 'test'),
$this->getRecord(Level::Warning, 'foo', channel: 'log'),
]);
$this->assertEquals([
[
'level_name' => 'CRITICAL',
'level' => Logger::CRITICAL,
'level_name' => LevelName::Critical->value,
'level' => Level::Critical->value,
'channel' => 'test',
'message' => 'bar',
'context' => [],
@@ -156,8 +157,8 @@ class NormalizerFormatterTest extends TestCase
'extra' => [],
],
[
'level_name' => 'WARNING',
'level' => Logger::WARNING,
'level_name' => LevelName::Warning->value,
'level' => Level::Warning->value,
'channel' => 'log',
'message' => 'foo',
'context' => [],
@@ -241,7 +242,7 @@ class NormalizerFormatterTest extends TestCase
$largeArray = range(1, 1000);
$res = $formatter->format($this->getRecord(
Logger::CRITICAL,
Level::Critical,
'bar',
channel: 'test',
context: [$largeArray],
@@ -257,7 +258,7 @@ class NormalizerFormatterTest extends TestCase
$largeArray = range(1, 2000);
$res = $formatter->format($this->getRecord(
Logger::CRITICAL,
Level::Critical,
'bar',
channel: 'test',
context: [$largeArray],
@@ -379,7 +380,7 @@ class NormalizerFormatterTest extends TestCase
private function formatRecordWithExceptionInContext(NormalizerFormatter $formatter, \Throwable $exception)
{
$message = $formatter->format($this->getRecord(
Logger::CRITICAL,
Level::Critical,
'foobar',
channel: 'core',
context: ['exception' => $exception],

View File

@@ -11,7 +11,7 @@
namespace Monolog\Formatter;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Test\TestCase;
class WildfireFormatterTest extends TestCase
@@ -23,7 +23,7 @@ class WildfireFormatterTest extends TestCase
{
$wildfire = new WildfireFormatter();
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['from' => 'logger'],
@@ -46,7 +46,7 @@ class WildfireFormatterTest extends TestCase
{
$wildfire = new WildfireFormatter();
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
context: ['from' => 'logger'],
@@ -69,7 +69,7 @@ class WildfireFormatterTest extends TestCase
{
$wildfire = new WildfireFormatter();
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
);
@@ -91,7 +91,7 @@ class WildfireFormatterTest extends TestCase
$wildfire = new WildfireFormatter();
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'log',
channel: 'meh',
);
@@ -106,7 +106,7 @@ class WildfireFormatterTest extends TestCase
{
$wildfire = new WildfireFormatter();
$record = $this->getRecord(
Logger::ERROR,
Level::Error,
'table-message',
channel: 'table-channel',
context: [

View File

@@ -11,8 +11,8 @@
namespace Monolog\Handler;
use Monolog\Level;
use Monolog\Test\TestCase;
use Monolog\Logger;
class AbstractHandlerTest extends TestCase
{
@@ -25,13 +25,13 @@ class AbstractHandlerTest extends TestCase
*/
public function testConstructAndGetSet()
{
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', [Logger::WARNING, false]);
$this->assertEquals(Logger::WARNING, $handler->getLevel());
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', [Level::Warning, false]);
$this->assertEquals(Level::Warning, $handler->getLevel());
$this->assertEquals(false, $handler->getBubble());
$handler->setLevel(Logger::ERROR);
$handler->setLevel(Level::Error);
$handler->setBubble(true);
$this->assertEquals(Logger::ERROR, $handler->getLevel());
$this->assertEquals(Level::Error, $handler->getLevel());
$this->assertEquals(true, $handler->getBubble());
}
@@ -51,9 +51,9 @@ class AbstractHandlerTest extends TestCase
*/
public function testIsHandling()
{
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', [Logger::WARNING, false]);
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', [Level::Warning, false]);
$this->assertTrue($handler->isHandling($this->getRecord()));
$this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));
$this->assertFalse($handler->isHandling($this->getRecord(Level::Debug)));
}
/**
@@ -62,8 +62,8 @@ class AbstractHandlerTest extends TestCase
public function testHandlesPsrStyleLevels()
{
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', ['warning', false]);
$this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG)));
$this->assertFalse($handler->isHandling($this->getRecord(Level::Debug)));
$handler->setLevel('debug');
$this->assertTrue($handler->isHandling($this->getRecord(Logger::DEBUG)));
$this->assertTrue($handler->isHandling($this->getRecord(Level::Debug)));
}
}

View File

@@ -12,7 +12,7 @@
namespace Monolog\Handler;
use Monolog\Test\TestCase;
use Monolog\Logger;
use Monolog\Level;
use Monolog\Processor\WebProcessor;
use Monolog\Formatter\LineFormatter;
@@ -24,7 +24,7 @@ class AbstractProcessingHandlerTest extends TestCase
*/
public function testConstructAndGetSet()
{
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', [Logger::WARNING, false]);
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', [Level::Warning, false]);
$handler->setFormatter($formatter = new LineFormatter);
$this->assertSame($formatter, $handler->getFormatter());
}
@@ -34,8 +34,8 @@ class AbstractProcessingHandlerTest extends TestCase
*/
public function testHandleLowerLevelMessage()
{
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', [Logger::WARNING, true]);
$this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG)));
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', [Level::Warning, true]);
$this->assertFalse($handler->handle($this->getRecord(Level::Debug)));
}
/**
@@ -43,7 +43,7 @@ class AbstractProcessingHandlerTest extends TestCase
*/
public function testHandleBubbling()
{
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', [Logger::DEBUG, true]);
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', [Level::Debug, true]);
$this->assertFalse($handler->handle($this->getRecord()));
}
@@ -52,7 +52,7 @@ class AbstractProcessingHandlerTest extends TestCase
*/
public function testHandleNotBubbling()
{
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', [Logger::DEBUG, false]);
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', [Level::Debug, false]);
$this->assertTrue($handler->handle($this->getRecord()));
}
@@ -61,9 +61,9 @@ class AbstractProcessingHandlerTest extends TestCase
*/
public function testHandleIsFalseWhenNotHandled()
{
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', [Logger::WARNING, false]);
$handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', [Level::Warning, false]);
$this->assertTrue($handler->handle($this->getRecord()));
$this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG)));
$this->assertFalse($handler->handle($this->getRecord(Level::Debug)));
}
/**

View File

@@ -12,7 +12,7 @@
namespace Monolog\Handler;
use Monolog\Test\TestCase;
use Monolog\Logger;
use Monolog\Level;
use PhpAmqpLib\Message\AMQPMessage;
/**
@@ -46,7 +46,7 @@ class AmqpHandlerTest extends TestCase
$handler = new AmqpHandler($exchange);
$record = $this->getRecord(Logger::WARNING, 'test', ['data' => new \stdClass, 'foo' => 34]);
$record = $this->getRecord(Level::Warning, 'test', ['data' => new \stdClass, 'foo' => 34]);
$expected = [
[
@@ -103,7 +103,7 @@ class AmqpHandlerTest extends TestCase
$handler = new AmqpHandler($exchange, 'log');
$record = $this->getRecord(Logger::WARNING, 'test', ['data' => new \stdClass, 'foo' => 34]);
$record = $this->getRecord(Level::Warning, 'test', ['data' => new \stdClass, 'foo' => 34]);
$expected = [
[

View File

@@ -12,7 +12,7 @@
namespace Monolog\Handler;
use Monolog\Test\TestCase;
use Monolog\Logger;
use Monolog\Level;
/**
* @covers Monolog\Handler\BrowserConsoleHandlerTest
@@ -37,7 +37,7 @@ class BrowserConsoleHandlerTest extends TestCase
$handler = new BrowserConsoleHandler();
$handler->setFormatter($this->getIdentityFormatter());
$handler->handle($this->getRecord(Logger::DEBUG, 'foo[[bar]]{color: red}'));
$handler->handle($this->getRecord(Level::Debug, 'foo[[bar]]{color: red}'));
$expected = <<<EOF
(function (c) {if (c && c.groupCollapsed) {
@@ -53,7 +53,7 @@ EOF;
$handler = new BrowserConsoleHandler();
$handler->setFormatter($this->getIdentityFormatter());
$handler->handle($this->getRecord(Logger::DEBUG, 'foo[[bar]]{color: red}[[baz]]{color: blue}'));
$handler->handle($this->getRecord(Level::Debug, 'foo[[bar]]{color: red}[[baz]]{color: blue}'));
$expected = <<<EOF
(function (c) {if (c && c.groupCollapsed) {
@@ -69,7 +69,7 @@ EOF;
$handler = new BrowserConsoleHandler();
$handler->setFormatter($this->getIdentityFormatter());
$handler->handle($this->getRecord(Logger::DEBUG, "[foo] [[\"bar\n[baz]\"]]{color: red}"));
$handler->handle($this->getRecord(Level::Debug, "[foo] [[\"bar\n[baz]\"]]{color: red}"));
$expected = <<<EOF
(function (c) {if (c && c.groupCollapsed) {
@@ -85,9 +85,9 @@ EOF;
$handler = new BrowserConsoleHandler();
$handler->setFormatter($this->getIdentityFormatter());
$handler->handle($this->getRecord(Logger::DEBUG, '[[foo]]{macro: autolabel}'));
$handler->handle($this->getRecord(Logger::DEBUG, '[[bar]]{macro: autolabel}'));
$handler->handle($this->getRecord(Logger::DEBUG, '[[foo]]{macro: autolabel}'));
$handler->handle($this->getRecord(Level::Debug, '[[foo]]{macro: autolabel}'));
$handler->handle($this->getRecord(Level::Debug, '[[bar]]{macro: autolabel}'));
$handler->handle($this->getRecord(Level::Debug, '[[foo]]{macro: autolabel}'));
$expected = <<<EOF
(function (c) {if (c && c.groupCollapsed) {
@@ -105,7 +105,7 @@ EOF;
$handler = new BrowserConsoleHandler();
$handler->setFormatter($this->getIdentityFormatter());
$handler->handle($this->getRecord(Logger::DEBUG, 'test', ['foo' => 'bar', 0 => 'oop']));
$handler->handle($this->getRecord(Level::Debug, 'test', ['foo' => 'bar', 0 => 'oop']));
$expected = <<<EOF
(function (c) {if (c && c.groupCollapsed) {
@@ -128,10 +128,10 @@ EOF;
$handler2 = new BrowserConsoleHandler();
$handler2->setFormatter($this->getIdentityFormatter());
$handler1->handle($this->getRecord(Logger::DEBUG, 'test1'));
$handler2->handle($this->getRecord(Logger::DEBUG, 'test2'));
$handler1->handle($this->getRecord(Logger::DEBUG, 'test3'));
$handler2->handle($this->getRecord(Logger::DEBUG, 'test4'));
$handler1->handle($this->getRecord(Level::Debug, 'test1'));
$handler2->handle($this->getRecord(Level::Debug, 'test2'));
$handler1->handle($this->getRecord(Level::Debug, 'test3'));
$handler2->handle($this->getRecord(Level::Debug, 'test4'));
$expected = <<<EOF
(function (c) {if (c && c.groupCollapsed) {

View File

@@ -12,7 +12,7 @@
namespace Monolog\Handler;
use Monolog\Test\TestCase;
use Monolog\Logger;
use Monolog\Level;
class BufferHandlerTest extends TestCase
{
@@ -27,8 +27,8 @@ class BufferHandlerTest extends TestCase
{
$test = new TestHandler();
$handler = new BufferHandler($test);
$handler->handle($this->getRecord(Logger::DEBUG));
$handler->handle($this->getRecord(Logger::INFO));
$handler->handle($this->getRecord(Level::Debug));
$handler->handle($this->getRecord(Level::Info));
$this->assertFalse($test->hasDebugRecords());
$this->assertFalse($test->hasInfoRecords());
$handler->close();
@@ -44,8 +44,8 @@ class BufferHandlerTest extends TestCase
{
$test = new TestHandler();
$handler = new BufferHandler($test);
$handler->handle($this->getRecord(Logger::WARNING));
$handler->handle($this->getRecord(Logger::DEBUG));
$handler->handle($this->getRecord(Level::Warning));
$handler->handle($this->getRecord(Level::Debug));
$this->shutdownCheckHandler = $test;
register_shutdown_function([$this, 'checkPropagation']);
}
@@ -65,10 +65,10 @@ class BufferHandlerTest extends TestCase
{
$test = new TestHandler();
$handler = new BufferHandler($test, 2);
$handler->handle($this->getRecord(Logger::DEBUG));
$handler->handle($this->getRecord(Logger::DEBUG));
$handler->handle($this->getRecord(Logger::INFO));
$handler->handle($this->getRecord(Logger::WARNING));
$handler->handle($this->getRecord(Level::Debug));
$handler->handle($this->getRecord(Level::Debug));
$handler->handle($this->getRecord(Level::Info));
$handler->handle($this->getRecord(Level::Warning));
$handler->close();
$this->assertTrue($test->hasWarningRecords());
$this->assertTrue($test->hasInfoRecords());
@@ -81,22 +81,22 @@ class BufferHandlerTest extends TestCase
public function testHandleBufferLimitWithFlushOnOverflow()
{
$test = new TestHandler();
$handler = new BufferHandler($test, 3, Logger::DEBUG, true, true);
$handler = new BufferHandler($test, 3, Level::Debug, true, true);
// send two records
$handler->handle($this->getRecord(Logger::DEBUG));
$handler->handle($this->getRecord(Logger::DEBUG));
$handler->handle($this->getRecord(Logger::DEBUG));
$handler->handle($this->getRecord(Level::Debug));
$handler->handle($this->getRecord(Level::Debug));
$handler->handle($this->getRecord(Level::Debug));
$this->assertFalse($test->hasDebugRecords());
$this->assertCount(0, $test->getRecords());
// overflow
$handler->handle($this->getRecord(Logger::INFO));
$handler->handle($this->getRecord(Level::Info));
$this->assertTrue($test->hasDebugRecords());
$this->assertCount(3, $test->getRecords());
// should buffer again
$handler->handle($this->getRecord(Logger::WARNING));
$handler->handle($this->getRecord(Level::Warning));
$this->assertCount(3, $test->getRecords());
$handler->close();
@@ -111,11 +111,11 @@ class BufferHandlerTest extends TestCase
public function testHandleLevel()
{
$test = new TestHandler();
$handler = new BufferHandler($test, 0, Logger::INFO);
$handler->handle($this->getRecord(Logger::DEBUG));
$handler->handle($this->getRecord(Logger::INFO));
$handler->handle($this->getRecord(Logger::WARNING));
$handler->handle($this->getRecord(Logger::DEBUG));
$handler = new BufferHandler($test, 0, Level::Info);
$handler->handle($this->getRecord(Level::Debug));
$handler->handle($this->getRecord(Level::Info));
$handler->handle($this->getRecord(Level::Warning));
$handler->handle($this->getRecord(Level::Debug));
$handler->close();
$this->assertTrue($test->hasWarningRecords());
$this->assertTrue($test->hasInfoRecords());
@@ -129,8 +129,8 @@ class BufferHandlerTest extends TestCase
{
$test = new TestHandler();
$handler = new BufferHandler($test, 0);
$handler->handle($this->getRecord(Logger::DEBUG));
$handler->handle($this->getRecord(Logger::INFO));
$handler->handle($this->getRecord(Level::Debug));
$handler->handle($this->getRecord(Level::Info));
$handler->flush();
$this->assertTrue($test->hasInfoRecords());
$this->assertTrue($test->hasDebugRecords());
@@ -149,7 +149,7 @@ class BufferHandlerTest extends TestCase
return $record;
});
$handler->handle($this->getRecord(Logger::WARNING));
$handler->handle($this->getRecord(Level::Warning));
$handler->flush();
$this->assertTrue($test->hasWarningRecords());
$records = $test->getRecords();

View File

@@ -12,7 +12,7 @@
namespace Monolog\Handler;
use Monolog\Test\TestCase;
use Monolog\Logger;
use Monolog\Level;
/**
* @covers Monolog\Handler\ChromePHPHandler
@@ -34,8 +34,8 @@ class ChromePHPHandlerTest extends TestCase
$handler = new TestChromePHPHandler();
$handler->setFormatter($this->getIdentityFormatter());
$handler->handle($this->getRecord(Logger::DEBUG));
$handler->handle($this->getRecord(Logger::WARNING));
$handler->handle($this->getRecord(Level::Debug));
$handler->handle($this->getRecord(Level::Warning));
$expected = [
'X-ChromeLogger-Data' => base64_encode(utf8_encode(json_encode([
@@ -65,11 +65,11 @@ class ChromePHPHandlerTest extends TestCase
public function testHeadersOverflow()
{
$handler = new TestChromePHPHandler();
$handler->handle($this->getRecord(Logger::DEBUG));
$handler->handle($this->getRecord(Logger::WARNING, str_repeat('a', 2 * 1024)));
$handler->handle($this->getRecord(Level::Debug));
$handler->handle($this->getRecord(Level::Warning, str_repeat('a', 2 * 1024)));
// overflow chrome headers limit
$handler->handle($this->getRecord(Logger::WARNING, str_repeat('b', 2 * 1024)));
$handler->handle($this->getRecord(Level::Warning, str_repeat('b', 2 * 1024)));
$expected = [
'X-ChromeLogger-Data' => base64_encode(utf8_encode(json_encode([
@@ -106,13 +106,13 @@ class ChromePHPHandlerTest extends TestCase
{
$handler = new TestChromePHPHandler();
$handler->setFormatter($this->getIdentityFormatter());
$handler->handle($this->getRecord(Logger::DEBUG));
$handler->handle($this->getRecord(Logger::WARNING));
$handler->handle($this->getRecord(Level::Debug));
$handler->handle($this->getRecord(Level::Warning));
$handler2 = new TestChromePHPHandler();
$handler2->setFormatter($this->getIdentityFormatter());
$handler2->handle($this->getRecord(Logger::DEBUG));
$handler2->handle($this->getRecord(Logger::WARNING));
$handler2->handle($this->getRecord(Level::Debug));
$handler2->handle($this->getRecord(Level::Warning));
$expected = [
'X-ChromeLogger-Data' => base64_encode(utf8_encode(json_encode([

View File

@@ -12,13 +12,13 @@
namespace Monolog\Handler;
use Monolog\Test\TestCase;
use Monolog\Logger;
use Monolog\Level;
class CouchDBHandlerTest extends TestCase
{
public function testHandle()
{
$record = $this->getRecord(Logger::WARNING, 'test', ['data' => new \stdClass, 'foo' => 34]);
$record = $this->getRecord(Level::Warning, 'test', ['data' => new \stdClass, 'foo' => 34]);
$handler = new CouchDBHandler();

View File

@@ -11,8 +11,8 @@
namespace Monolog\Handler;
use Monolog\Level;
use Monolog\Test\TestCase;
use Monolog\Logger;
class DeduplicationHandlerTest extends TestCase
{
@@ -23,10 +23,10 @@ class DeduplicationHandlerTest extends TestCase
{
$test = new TestHandler();
@unlink(sys_get_temp_dir().'/monolog_dedup.log');
$handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);
$handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', Level::Debug);
$handler->handle($this->getRecord(Logger::DEBUG));
$handler->handle($this->getRecord(Logger::INFO));
$handler->handle($this->getRecord(Level::Debug));
$handler->handle($this->getRecord(Level::Info));
$handler->flush();
@@ -43,10 +43,10 @@ class DeduplicationHandlerTest extends TestCase
{
$test = new TestHandler();
@unlink(sys_get_temp_dir().'/monolog_dedup.log');
$handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);
$handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', Level::Debug);
$handler->handle($this->getRecord(Logger::ERROR, 'Foo:bar'));
$handler->handle($this->getRecord(Logger::CRITICAL, "Foo\nbar"));
$handler->handle($this->getRecord(Level::Error, 'Foo:bar'));
$handler->handle($this->getRecord(Level::Critical, "Foo\nbar"));
$handler->flush();
@@ -64,10 +64,10 @@ class DeduplicationHandlerTest extends TestCase
public function testFlushSkipsIfLogExists()
{
$test = new TestHandler();
$handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);
$handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', Level::Debug);
$handler->handle($this->getRecord(Logger::ERROR, 'Foo:bar'));
$handler->handle($this->getRecord(Logger::CRITICAL, "Foo\nbar"));
$handler->handle($this->getRecord(Level::Error, 'Foo:bar'));
$handler->handle($this->getRecord(Level::Critical, "Foo\nbar"));
$handler->flush();
@@ -85,11 +85,11 @@ class DeduplicationHandlerTest extends TestCase
public function testFlushPassthruIfLogTooOld()
{
$test = new TestHandler();
$handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);
$handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', Level::Debug);
$record = $this->getRecord(Logger::ERROR, datetime: new \DateTimeImmutable('+62seconds'));
$record = $this->getRecord(Level::Error, datetime: new \DateTimeImmutable('+62seconds'));
$handler->handle($record);
$record = $this->getRecord(Logger::CRITICAL, datetime: new \DateTimeImmutable('+62seconds'));
$record = $this->getRecord(Level::Critical, datetime: new \DateTimeImmutable('+62seconds'));
$handler->handle($record);
$handler->flush();
@@ -109,14 +109,14 @@ class DeduplicationHandlerTest extends TestCase
{
$test = new TestHandler();
@unlink(sys_get_temp_dir().'/monolog_dedup.log');
$handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0);
$handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', Level::Debug);
// handle two records from yesterday, and one recent
$record = $this->getRecord(Logger::ERROR, datetime: new \DateTimeImmutable('-1day -10seconds'));
$record = $this->getRecord(Level::Error, datetime: new \DateTimeImmutable('-1day -10seconds'));
$handler->handle($record);
$record2 = $this->getRecord(Logger::CRITICAL, datetime: new \DateTimeImmutable('-1day -10seconds'));
$record2 = $this->getRecord(Level::Critical, datetime: new \DateTimeImmutable('-1day -10seconds'));
$handler->handle($record2);
$record3 = $this->getRecord(Logger::CRITICAL, datetime: new \DateTimeImmutable('-30seconds'));
$record3 = $this->getRecord(Level::Critical, datetime: new \DateTimeImmutable('-30seconds'));
$handler->handle($record3);
// log is written as none of them are duplicate
@@ -137,8 +137,8 @@ class DeduplicationHandlerTest extends TestCase
$this->assertFalse($test->hasCriticalRecords());
// log new records, duplicate log gets GC'd at the end of this flush call
$handler->handle($record = $this->getRecord(Logger::ERROR));
$handler->handle($record2 = $this->getRecord(Logger::CRITICAL));
$handler->handle($record = $this->getRecord(Level::Error));
$handler->handle($record2 = $this->getRecord(Level::Critical));
$handler->flush();
// log should now contain the new errors and the previous one that was recent enough

View File

@@ -12,7 +12,7 @@
namespace Monolog\Handler;
use Monolog\Test\TestCase;
use Monolog\Logger;
use Monolog\Level;
class DoctrineCouchDBHandlerTest extends TestCase
{
@@ -30,12 +30,12 @@ class DoctrineCouchDBHandlerTest extends TestCase
->disableOriginalConstructor()
->getMock();
$record = $this->getRecord(Logger::WARNING, 'test', ['data' => new \stdClass, 'foo' => 34]);
$record = $this->getRecord(Level::Warning, 'test', ['data' => new \stdClass, 'foo' => 34]);
$expected = [
'message' => 'test',
'context' => ['data' => ['stdClass' => []], 'foo' => 34],
'level' => Logger::WARNING,
'level' => Level::Warning->value,
'level_name' => 'WARNING',
'channel' => 'test',
'datetime' => (string) $record->datetime,

View File

@@ -14,7 +14,7 @@ namespace Monolog\Handler;
use Monolog\Formatter\ElasticaFormatter;
use Monolog\Formatter\NormalizerFormatter;
use Monolog\Test\TestCase;
use Monolog\Logger;
use Monolog\Level;
use Monolog\LogRecord;
use Elastica\Client;
use Elastica\Request;
@@ -58,7 +58,7 @@ class ElasticaHandlerTest extends TestCase
public function testHandle()
{
// log message
$msg = $this->getRecord(Logger::ERROR, 'log', context: ['foo' => 7, 'bar', 'class' => new \stdClass], datetime: new \DateTimeImmutable("@0"));
$msg = $this->getRecord(Level::Error, 'log', context: ['foo' => 7, 'bar', 'class' => new \stdClass], datetime: new \DateTimeImmutable("@0"));
// format expected result
$formatter = new ElasticaFormatter($this->options['index'], $this->options['type']);
@@ -158,7 +158,7 @@ class ElasticaHandlerTest extends TestCase
*/
public function testHandleIntegration()
{
$msg = $this->getRecord(Logger::ERROR, 'log', context: ['foo' => 7, 'bar', 'class' => new \stdClass], datetime: new \DateTimeImmutable("@0"));
$msg = $this->getRecord(Level::Error, 'log', context: ['foo' => 7, 'bar', 'class' => new \stdClass], datetime: new \DateTimeImmutable("@0"));
$expected = $msg->toArray();
$expected['datetime'] = $msg['datetime']->format(\DateTime::ISO8601);
@@ -204,7 +204,7 @@ class ElasticaHandlerTest extends TestCase
*/
public function testHandleIntegrationNewESVersion()
{
$msg = $this->getRecord(Logger::ERROR, 'log', context: ['foo' => 7, 'bar', 'class' => new \stdClass], datetime: new \DateTimeImmutable("@0"));
$msg = $this->getRecord(Level::Error, 'log', context: ['foo' => 7, 'bar', 'class' => new \stdClass], datetime: new \DateTimeImmutable("@0"));
$expected = (array) $msg;
$expected['datetime'] = $msg['datetime']->format(\DateTime::ISO8601);

View File

@@ -15,7 +15,7 @@ use Elasticsearch\ClientBuilder;
use Monolog\Formatter\ElasticsearchFormatter;
use Monolog\Formatter\NormalizerFormatter;
use Monolog\Test\TestCase;
use Monolog\Logger;
use Monolog\Level;
use Elasticsearch\Client;
class ElasticsearchHandlerTest extends TestCase
@@ -56,7 +56,7 @@ class ElasticsearchHandlerTest extends TestCase
public function testHandle()
{
// log message
$msg = $this->getRecord(Logger::ERROR, 'log', context: ['foo' => 7, 'bar', 'class' => new \stdClass], datetime: new \DateTimeImmutable("@0"));
$msg = $this->getRecord(Level::Error, 'log', context: ['foo' => 7, 'bar', 'class' => new \stdClass], datetime: new \DateTimeImmutable("@0"));
// format expected result
$formatter = new ElasticsearchFormatter($this->options['index'], $this->options['type']);
@@ -172,7 +172,7 @@ class ElasticsearchHandlerTest extends TestCase
*/
public function testHandleIntegration()
{
$msg = $this->getRecord(Logger::ERROR, 'log', context: ['foo' => 7, 'bar', 'class' => new \stdClass], datetime: new \DateTimeImmutable("@0"));
$msg = $this->getRecord(Level::Error, 'log', context: ['foo' => 7, 'bar', 'class' => new \stdClass], datetime: new \DateTimeImmutable("@0"));
$expected = $msg->toArray();
$expected['datetime'] = $msg['datetime']->format(\DateTime::ISO8601);

Some files were not shown because too many files have changed in this diff Show More