Updates for v9.0 release
This commit is contained in:
107
src/Logging/Logger/Flag.php
Normal file
107
src/Logging/Logger/Flag.php
Normal file
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* AUTOR: Clemens Schwaighofer
|
||||
* CREATED: 2023/5/29
|
||||
* DESCRIPTION:
|
||||
* Logging options flags for output file name building
|
||||
*
|
||||
* per_run: and timestamp + uid will be added
|
||||
* per_date: ymd will be added (per_run > per_date, cannot be used at the same time)
|
||||
* per_group: for debug level, group per group id (old level)
|
||||
* per_page: per file name logging
|
||||
* per_class: log per class
|
||||
* per_level: per logging level file split
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace CoreLibs\Logging\Logger;
|
||||
|
||||
enum Flag: int
|
||||
{
|
||||
/** all off flag */
|
||||
case all_off = 0;
|
||||
|
||||
/** write per run */
|
||||
case per_run = 1;
|
||||
|
||||
/** write per date */
|
||||
case per_date = 2;
|
||||
|
||||
/** was PER_LEVEL, write per group id (debug) */
|
||||
case per_group = 4;
|
||||
|
||||
/** write per page (filename) */
|
||||
case per_page = 8;
|
||||
|
||||
/** write per class */
|
||||
case per_class = 16;
|
||||
|
||||
/** write per log level name */
|
||||
case per_level = 32;
|
||||
|
||||
/**
|
||||
* get internal name from string value
|
||||
*
|
||||
* @param non-empty-string $name
|
||||
* @return self
|
||||
*/
|
||||
public static function fromName(string $name): self
|
||||
{
|
||||
return match ($name) {
|
||||
'Run', 'run', 'per_run', 'PER_RUN' => self::per_run,
|
||||
'Date', 'date', 'per_date', 'PER_DATE' => self::per_date,
|
||||
'Group', 'group', 'per_group', 'PER_GROUP' => self::per_group,
|
||||
'Page', 'page', 'per_page', 'PER_PAGE' => self::per_page,
|
||||
'Class', 'class', 'per_class', 'PER_CLASS' => self::per_class,
|
||||
'Level', 'level', 'per_level', 'PER_LEVEL' => self::per_level,
|
||||
default => self::all_off,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get internal name from int value
|
||||
*
|
||||
* @param int $value
|
||||
* @return self
|
||||
*/
|
||||
public static function fromValue(int $value): self
|
||||
{
|
||||
return self::from($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* convert current set level to name (upper case)
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName(): string
|
||||
{
|
||||
return strtoupper($this->name);
|
||||
}
|
||||
|
||||
/** @var int[] */
|
||||
public const VALUES = [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
4,
|
||||
8,
|
||||
16,
|
||||
32,
|
||||
];
|
||||
|
||||
/** @var string[] */
|
||||
public const NAMES = [
|
||||
'ALL_OFF',
|
||||
'PER_RUN',
|
||||
'PER_DATE',
|
||||
'PER_GROUP',
|
||||
'PER_PAGE',
|
||||
'PER_CLASS',
|
||||
'PER_LEVEL',
|
||||
];
|
||||
}
|
||||
|
||||
// __END__
|
||||
216
src/Logging/Logger/Level.php
Normal file
216
src/Logging/Logger/Level.php
Normal file
@@ -0,0 +1,216 @@
|
||||
<?php // phpcs:disable Generic.Files.LineLength
|
||||
|
||||
/**
|
||||
* AUTOR: Clemens Schwaighofer
|
||||
* CREATED: 2023-05-25
|
||||
* DESCRIPTION:
|
||||
* Debug levels
|
||||
*
|
||||
* They are based on the Mono log ones
|
||||
* FC 5424 {@see https://datatracker.ietf.org/doc/html/rfc5424}
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace CoreLibs\Logging\Logger;
|
||||
|
||||
use Psr\Log\LogLevel;
|
||||
|
||||
/**
|
||||
* Represents the log levels
|
||||
*
|
||||
* Monolog supports the logging levels described by RFC 5424 {@see https://datatracker.ietf.org/doc/html/rfc5424}
|
||||
* but due to BC the severity values used internally are not 0-7.
|
||||
*
|
||||
* To get the level name/value out of a Level there are several options:
|
||||
*
|
||||
* - Use ->getName() to get the standard Monolog name which is full uppercased (e.g. "DEBUG")
|
||||
* - Use ->toPsrLogLevel() to get the standard PSR-3 name which is full lowercased (e.g. "debug")
|
||||
* - Use ->toRFC5424Level() to get the standard RFC 5424 value (e.g. 7 for debug, 0 for emergency)
|
||||
* - Use ->name to get the enum case's name which is capitalized (e.g. "Debug")
|
||||
*
|
||||
* To get the internal value for filtering, if the includes/isLowerThan/isHigherThan methods are
|
||||
* not enough, you can use ->value to get the enum case's integer value.
|
||||
*/
|
||||
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;
|
||||
|
||||
/**
|
||||
* @param value-of<self::NAMES>|LogLevel::*|'Debug'|'Info'|'Notice'|'Warning'|'Error'|'Critical'|'Alert'|'Emergency' $name
|
||||
* @return static
|
||||
*/
|
||||
public static function fromName(string $name): self
|
||||
{
|
||||
return match ($name) {
|
||||
'debug', 'Debug', 'DEBUG' => self::Debug,
|
||||
'info', 'Info', 'INFO' => self::Info,
|
||||
'notice', 'Notice', 'NOTICE' => self::Notice,
|
||||
'warning', 'Warning', 'WARNING' => self::Warning,
|
||||
'error', 'Error', 'ERROR' => self::Error,
|
||||
'critical', 'Critical', 'CRITICAL' => self::Critical,
|
||||
'alert', 'Alert', 'ALERT' => self::Alert,
|
||||
'emergency', 'Emergency', 'EMERGENCY' => self::Emergency,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @param value-of<self::VALUES> $value
|
||||
* @return static
|
||||
*/
|
||||
public static function fromValue(int $value): self
|
||||
{
|
||||
return self::from($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the monolog standardized all-capitals name of the level
|
||||
*
|
||||
* Use this instead of $level->name which returns the enum case name (e.g. Debug vs DEBUG if you use getName())
|
||||
*
|
||||
* @phan-suppress-next-line PhanTypeMismatchDeclaredReturn
|
||||
* @return value-of<self::NAMES>
|
||||
*/
|
||||
public function getName(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::Debug => 'DEBUG',
|
||||
self::Info => 'INFO',
|
||||
self::Notice => 'NOTICE',
|
||||
self::Warning => 'WARNING',
|
||||
self::Error => 'ERROR',
|
||||
self::Critical => 'CRITICAL',
|
||||
self::Alert => 'ALERT',
|
||||
self::Emergency => 'EMERGENCY',
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the PSR-3 level matching this instance
|
||||
*
|
||||
* @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,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the RFC 5424 level matching this instance
|
||||
*
|
||||
* @phpstan-return int<0, 7>
|
||||
*/
|
||||
public function toRFC5424Level(): int
|
||||
{
|
||||
return match ($this) {
|
||||
self::Debug => 7,
|
||||
self::Info => 6,
|
||||
self::Notice => 5,
|
||||
self::Warning => 4,
|
||||
self::Error => 3,
|
||||
self::Critical => 2,
|
||||
self::Alert => 1,
|
||||
self::Emergency => 0,
|
||||
};
|
||||
}
|
||||
|
||||
public const VALUES = [
|
||||
100,
|
||||
200,
|
||||
250,
|
||||
300,
|
||||
400,
|
||||
500,
|
||||
550,
|
||||
600,
|
||||
];
|
||||
|
||||
public const NAMES = [
|
||||
'DEBUG',
|
||||
'INFO',
|
||||
'NOTICE',
|
||||
'WARNING',
|
||||
'ERROR',
|
||||
'CRITICAL',
|
||||
'ALERT',
|
||||
'EMERGENCY',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
// __END__
|
||||
1334
src/Logging/Logging.php
Normal file
1334
src/Logging/Logging.php
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user