raven-8.x-2.x-dev/src/LogLevel.php
src/LogLevel.php
<?php
namespace Drupal\raven;
use Drupal\Core\Logger\RfcLogLevel;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Psr\Log\LogLevel as PsrLogLevel;
use Sentry\Breadcrumb;
use Sentry\Logs\LogLevel as LogsLogLevel;
use Sentry\Severity;
/**
* Maps various classes of log levels.
*/
enum LogLevel {
case Emergency;
case Alert;
case Critical;
case Error;
case Warning;
case Notice;
case Info;
case Debug;
/**
* Returns a LogLevel from an arbitrary integer or string.
*/
public static function fromLevel(mixed $level): self {
return match ($level) {
RfcLogLevel::EMERGENCY, PsrLogLevel::EMERGENCY => self::Emergency,
RfcLogLevel::ALERT, PsrLogLevel::ALERT => self::Alert,
RfcLogLevel::CRITICAL, PsrLogLevel::CRITICAL => self::Critical,
RfcLogLevel::ERROR, PsrLogLevel::ERROR => self::Error,
RfcLogLevel::WARNING, PsrLogLevel::WARNING => self::Warning,
RfcLogLevel::NOTICE, PsrLogLevel::NOTICE => self::Notice,
RfcLogLevel::INFO, PsrLogLevel::INFO => self::Info,
RfcLogLevel::DEBUG, PsrLogLevel::DEBUG => self::Debug,
default => self::Info,
};
}
/**
* Returns the log level configuration options.
*
* @return array<string, TranslatableMarkup>
* The log level configuration options.
*/
public static function getOptions(): array {
foreach (self::cases() as $level) {
$options[$level->getPsrLogLevel()] = $level->getLabel();
}
return $options;
}
/**
* Migrates log level config from off-by-one RFC integers to PSR booleans.
*
* @param array<int, int> $old_levels
* Array of numeric log level configs.
*
* @return array<string, bool>
* Array of log level configs.
*/
public static function migrateLogLevels(array $old_levels): array {
foreach (self::cases() as $level) {
$levels[$level->getPsrLogLevel()] = !empty($old_levels[$level->getRfcLogLevel() + 1]);
}
return $levels;
}
/**
* Returns the Sentry breadcrumb level.
*/
public function getBreadcrumbLevel(): string {
return match ($this) {
self::Emergency => Breadcrumb::LEVEL_FATAL,
self::Alert => Breadcrumb::LEVEL_FATAL,
self::Critical => Breadcrumb::LEVEL_FATAL,
self::Error => Breadcrumb::LEVEL_ERROR,
self::Warning => Breadcrumb::LEVEL_WARNING,
self::Notice => Breadcrumb::LEVEL_INFO,
self::Info => Breadcrumb::LEVEL_INFO,
self::Debug => Breadcrumb::LEVEL_DEBUG,
};
}
/**
* Returns the PSR-3 log level.
*/
public function getPsrLogLevel(): string {
return match ($this) {
self::Emergency => PsrLogLevel::EMERGENCY,
self::Alert => PsrLogLevel::ALERT,
self::Critical => PsrLogLevel::CRITICAL,
self::Error => PsrLogLevel::ERROR,
self::Warning => PsrLogLevel::WARNING,
self::Notice => PsrLogLevel::NOTICE,
self::Info => PsrLogLevel::INFO,
self::Debug => PsrLogLevel::DEBUG,
};
}
/**
* Returns the RFC 5424 log level.
*/
public function getRfcLogLevel(): int {
return match ($this) {
self::Emergency => RfcLogLevel::EMERGENCY,
self::Alert => RfcLogLevel::ALERT,
self::Critical => RfcLogLevel::CRITICAL,
self::Error => RfcLogLevel::ERROR,
self::Warning => RfcLogLevel::WARNING,
self::Notice => RfcLogLevel::NOTICE,
self::Info => RfcLogLevel::INFO,
self::Debug => RfcLogLevel::DEBUG,
};
}
/**
* Returns the Sentry severity.
*/
public function getSeverity(): Severity {
return match ($this) {
self::Emergency => Severity::fatal(),
self::Alert => Severity::fatal(),
self::Critical => Severity::fatal(),
self::Error => Severity::error(),
self::Warning => Severity::warning(),
self::Notice => Severity::info(),
self::Info => Severity::info(),
self::Debug => Severity::debug(),
};
}
/**
* Returns the Sentry log severity level.
*/
public function getLogsLogLevel(): LogsLogLevel {
return match ($this) {
self::Emergency => LogsLogLevel::fatal(),
self::Alert => LogsLogLevel::fatal(),
self::Critical => LogsLogLevel::fatal(),
self::Error => LogsLogLevel::error(),
self::Warning => LogsLogLevel::warn(),
self::Notice => LogsLogLevel::info(),
self::Info => LogsLogLevel::info(),
self::Debug => LogsLogLevel::debug(),
};
}
/**
* Returns the translatable label.
*/
public function getLabel(): TranslatableMarkup {
return RfcLogLevel::getLevels()[$this->getRfcLogLevel()];
}
/**
* Returns TRUE if this log level is enabled.
*
* @param mixed[] $levels
* The log levels configuration.
*/
public function isEnabled(array $levels): bool {
return !empty($levels[$this->getPsrLogLevel()]);
}
}
