diff --git a/README.md b/README.md index ad79bf0..a63a87d 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,44 @@ validate( See more about validator rules in [yiisoft/validator](https://github.com/yiisoft/validator) +### `log_message(string $level, string|stringable $message, array $context = []): void + +- `$level` is a log level. Available levels: `emergency`, `alert`, `critical`, `error`, `warning`, `notice`, `info`, `debug`. + - You can use `\Psr\Log\LogLevel` constants: + - `\Psr\Log\LogLevel::EMERGENCY` + - `\Psr\Log\LogLevel::ALERT` + - `\Psr\Log\LogLevel::CRITICAL` + - `\Psr\Log\LogLevel::ERROR` + - `\Psr\Log\LogLevel::WARNING` + - `\Psr\Log\LogLevel::NOTICE` + - `\Psr\Log\LogLevel::INFO` + - `\Psr\Log\LogLevel::DEBUG`. +- `$message` is a log message +- `$context` is a log context + +Also, you can use already level-specific functions: +- `log_emergency(string|Stringable $message, array $context = []): void` +- `log_alert(string|Stringable $message, array $context = []): void` +- `log_critical(string|Stringable $message, array $context = []): void` +- `log_error(string|Stringable $message, array $context = []): void` +- `log_warning(string|Stringable $message, array $context = []): void` +- `log_notice(string|Stringable $message, array $context = []): void` +- `log_info(string|Stringable $message, array $context = []): void` +- `log_debug(string|Stringable $message, array $context = []): void` + +```php +log_message('info', 'Some info message'); +log_message('error', 'Could not authenticate user with ID {user_id}', ['user_id' => $userId]); + +log_info('Info message'); +log_error('Error message'); +log_warning('Warning message'); +log_notice('Notice message'); +log_debug('Debug message'); +log_critical('Critical message'); +log_alert('Alert message'); +log_emergency('Emergency message'); +``` ## Looking for more modules? diff --git a/src/logger.php b/src/logger.php new file mode 100644 index 0000000..13f53c1 --- /dev/null +++ b/src/logger.php @@ -0,0 +1,58 @@ +log($level, $message, $context); +} diff --git a/tests/LoggerTest.php b/tests/LoggerTest.php new file mode 100644 index 0000000..be8cfdd --- /dev/null +++ b/tests/LoggerTest.php @@ -0,0 +1,86 @@ +assertTrue(function_exists('log_error')); + $this->assertTrue(function_exists('log_info')); + $this->assertTrue(function_exists('log_warning')); + $this->assertTrue(function_exists('log_debug')); + $this->assertTrue(function_exists('log_notice')); + $this->assertTrue(function_exists('log_critical')); + $this->assertTrue(function_exists('log_emergency')); + $this->assertTrue(function_exists('log_alert')); + $this->assertTrue(function_exists('log_message')); + } + + public function testLogMessage(): void + { + $this->initEnvironment(); + $this->expectNotToPerformAssertions(); + + log_message('error', 'test message', ['some context']); + } + + #[DataProvider('dataLogFunctions')] + public function testLogFunctions(string $function, string|Stringable $message, array $context): void + { + $this->initEnvironment(); + $this->expectNotToPerformAssertions(); + + $function($message, $context); + } + + public static function dataLogFunctions(): iterable + { + yield 'log_error' => ['log_error', 'message', []]; + yield 'log_error' => ['log_error', new StringableClass('message'), ['key' => 'value']]; + + yield 'log_info' => ['log_info', 'message', []]; + yield 'log_info' => ['log_info', new StringableClass('message'), ['key' => 'value']]; + + yield 'log_warning' => ['log_warning', 'message', []]; + yield 'log_warning' => ['log_warning', new StringableClass('message'), ['key' => 'value']]; + + yield 'log_debug' => ['log_debug', 'message', []]; + yield 'log_debug' => ['log_debug', new StringableClass('message'), ['key' => 'value']]; + + yield 'log_notice' => ['log_notice', 'message', []]; + yield 'log_notice' => ['log_notice', new StringableClass('message'), ['key' => 'value']]; + + yield 'log_alert' => ['log_alert', 'message', []]; + yield 'log_alert' => ['log_alert', new StringableClass('message'), ['key' => 'value']]; + + yield 'log_critical' => ['log_critical', 'message', []]; + yield 'log_critical' => ['log_critical', new StringableClass('message'), ['key' => 'value']]; + + yield 'log_emergency' => ['log_emergency', 'message', []]; + yield 'log_emergency' => ['log_emergency', new StringableClass('message'), ['key' => 'value']]; + } + + public function bootstrapFiles(): iterable + { + yield __DIR__ . '/../src/container.php'; + yield __DIR__ . '/../src/logger.php'; + } + + protected function initEnvironment(): void + { + State::$container = new SimpleContainer([ + LoggerInterface::class => new NullLogger(), + ]); + } +} \ No newline at end of file diff --git a/tests/Support/StringableClass.php b/tests/Support/StringableClass.php new file mode 100644 index 0000000..e27d0ae --- /dev/null +++ b/tests/Support/StringableClass.php @@ -0,0 +1,19 @@ +string; + } +} \ No newline at end of file