From 9291fc3af8d0d87b58ef2de96f5d650038db32c0 Mon Sep 17 00:00:00 2001 From: Asko Nõmm Date: Fri, 15 Nov 2024 10:57:19 +0200 Subject: Implement LoggerInterface. --- composer.json | 3 ++- composer.lock | 59 ++++++++++++++++++++++++++++++++++++++++++++++++---- src/Format.php | 36 ++++++++++++++++++++++++++++++++ src/Loggr.php | 54 +++++++++++++++++++++++++++++++---------------- src/Message.php | 1 + tests/FormatTest.php | 14 +++++++------ 6 files changed, 138 insertions(+), 29 deletions(-) diff --git a/composer.json b/composer.json index 83327a3..49ce1b5 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,8 @@ } ], "require": { - "php": ">=8.3" + "php": ">=8.3", + "psr/log": "^3.0" }, "require-dev": { "phpunit/phpunit": "11", diff --git a/composer.lock b/composer.lock index 8e1cda9..39176f7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,59 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8db78070bd8f6669783c69389435993b", - "packages": [], + "content-hash": "d206ce8d207d38506e18de159f8e68ad", + "packages": [ + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + } + ], "packages-dev": [ { "name": "hamcrest/hamcrest-php", @@ -1931,12 +1982,12 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { "php": ">=8.3" }, - "platform-dev": [], + "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/src/Format.php b/src/Format.php index d6764f0..e095e29 100644 --- a/src/Format.php +++ b/src/Format.php @@ -46,6 +46,7 @@ enum Format $json = json_encode([ 'date' => $dateTime->format('Y-m-d H:i:s'), 'level' => $message->level->value, + 'message' => $message->content, 'context' => $message->context, 'trace' => [ 'file' => pathinfo($trace_file, PATHINFO_FILENAME), @@ -79,6 +80,18 @@ enum Format $filename = pathinfo($trace_file, PATHINFO_FILENAME); $line .= "{$filename}.{$message->level->value}: "; + // Message + if (!empty($message->content) && !empty($message->context)) { + $line .= "{$message->content} - "; + } + + if (!empty($message->content) && empty($message->context)) { + $line .= "{$message->content}"; + } + + // Context + if (empty($message->context)) return $line; + // Context if (is_array($message->context) || is_object($message->context)) { $line .= json_encode($message->context); @@ -110,7 +123,18 @@ enum Format $filename = pathinfo($trace_file, PATHINFO_FILENAME); $line .= "{$filename}.{$message->level->value}: "; + // Message + if (!empty($message->content) && !empty($message->context)) { + $line .= "{$message->content} - "; + } + + if (!empty($message->content) && empty($message->context)) { + $line .= "{$message->content}"; + } + // Context + if (empty($message->context)) return $line; + if (is_array($message->context) || is_object($message->context)) { $line .= json_encode($message->context); } @@ -149,6 +173,18 @@ enum Format $filename = pathinfo($trace_file, PATHINFO_FILENAME); $line .= "- {$filename} - "; + // Message + if (!empty($message->content) && !empty($message->context)) { + $line .= "{$message->content} - "; + } + + if (!empty($message->content) && empty($message->context)) { + $line .= "{$message->content}"; + } + + // Context + if (empty($message->context)) return $line; + // Context if (is_array($message->context) || is_object($message->context)) { $line .= json_encode($message->context); diff --git a/src/Loggr.php b/src/Loggr.php index 1d5a58d..742195a 100644 --- a/src/Loggr.php +++ b/src/Loggr.php @@ -2,6 +2,8 @@ namespace Asko\Loggr; +use Psr\Log\LoggerInterface; + /** * Loggr is an extendable logging utility class brought to you by the frustration of * every logging class always having its own unique format, making debugging difficult. @@ -11,7 +13,7 @@ namespace Asko\Loggr; * * @author Asko Nõmm */ -class Loggr +class Loggr implements LoggerInterface { /** @var array $trace */ private array $trace; @@ -34,10 +36,11 @@ class Loggr * Logs a message at a specified level with optional context. * * @param Level $level The severity level of the log message. Defaults to Level::Info. + * @param string $message The log message. * @param mixed $context Additional data or context to include with the log message. Optional. * @return void */ - private function log(Level $level = Level::Info, mixed $context = null): void + private function write(Level $level, string $message, mixed $context = null): void { if (!$this->driver || !$this->format) { $this->error = "Driver or format not set."; @@ -48,6 +51,7 @@ class Loggr $this->driver->log($this->format->serialize(new Message( level: $level, trace: $this->trace, + content: $message, context: $context, ))); } catch(\Throwable $e) { @@ -58,96 +62,110 @@ class Loggr /** * Logs an emergency level message with optional context. * + * @param string|\Stringable $message * @param mixed $context Additional data or context to include with the emergency message. Optional. * @return void */ - public function emergency(mixed $context = null): void + public function emergency(string|\Stringable $message, mixed $context = null): void { $this->trace = debug_backtrace()[0]; - $this->log(Level::Emergency, $context); + $this->write(Level::Emergency, $message, $context); } /** * Sends an alert-level log message with optional context. * + * @param string|\Stringable $message * @param mixed $context Additional data or context to include with the log message. Optional. * @return void */ - public function alert(mixed $context = null): void + public function alert(string|\Stringable $message, mixed $context = null): void { $this->trace = debug_backtrace()[0]; - $this->log(Level::Alert, $context); + $this->write(Level::Alert, $message, $context); } /** * Logs a critical level message with optional context. * + * @param string|\Stringable $message * @param mixed $context Additional data or context to include with the log message. Optional. * @return void */ - public function critical( mixed $context = null): void + public function critical(string|\Stringable $message, mixed $context = null): void { $this->trace = debug_backtrace()[0]; - $this->log(Level::Critical, $context); + $this->write(Level::Critical, $message, $context); } /** * Logs an error message with optional context. * + * @param string|\Stringable $message * @param mixed $context Additional data or context to include with the error message. Optional. * @return void */ - public function error(mixed $context = null): void + public function error(string|\Stringable $message, mixed $context = null): void { $this->trace = debug_backtrace()[0]; - $this->log(Level::Error, $context); + $this->write(Level::Error, $message, $context); } /** * Logs a warning message with the specified context. * + * @param string|\Stringable $message * @param mixed $context Optional context information to include in the log. * @return void */ - public function warning(mixed $context = null): void + public function warning(string|\Stringable $message, mixed $context = null): void { $this->trace = debug_backtrace()[0]; - $this->log(Level::Warning, $context); + $this->write(Level::Warning, $message, $context); } /** * Logs a notice message with the specified context. * + * @param string|\Stringable $message * @param mixed $context Optional context information to include in the log. * @return void */ - public function notice(mixed $context = null): void + public function notice(string|\Stringable $message, mixed $context = null): void { $this->trace = debug_backtrace()[0]; - $this->log(Level::Notice, $context); + $this->write(Level::Notice, $message, $context); } /** * Logs an informational message with the specified context. * + * @param string|\Stringable $message * @param mixed $context Optional context information to include in the log. * @return void */ - public function info(mixed $context = null): void + public function info(string|\Stringable $message, mixed $context = null): void { $this->trace = debug_backtrace()[0]; - $this->log(Level::Info, $context); + $this->write(Level::Info, $message, $context); } /** * Logs a debug message with the specified context. * + * @param string|\Stringable $message * @param mixed $context Optional context information to include in the log. * @return void */ - public function debug(mixed $context = null): void + public function debug(string|\Stringable $message, mixed $context = null): void + { + $this->trace = debug_backtrace()[0]; + $this->write(Level::Debug, $message, $context); + } + + public function log($level, \Stringable|string $message, array $context = []): void { $this->trace = debug_backtrace()[0]; - $this->log(Level::Debug, $context); + $this->write(Level::from($level), $message, $context); } } \ No newline at end of file diff --git a/src/Message.php b/src/Message.php index 972b01a..75e5e22 100644 --- a/src/Message.php +++ b/src/Message.php @@ -11,6 +11,7 @@ readonly class Message public Level $level, /** @var array $trace */ public array $trace = [], + public string $content = '', public mixed $context = null, ) {} } \ No newline at end of file diff --git a/tests/FormatTest.php b/tests/FormatTest.php index f000631..16f765d 100644 --- a/tests/FormatTest.php +++ b/tests/FormatTest.php @@ -16,13 +16,13 @@ class FormatTest extends MockeryTestCase $message = new Message( level: Level::Info, trace: debug_backtrace()[0], - context: ['message' => 'test'], + context: ['test' => 'test'], ); $format = Format::JSON; $serializedMessage = $format->serialize($message); $full_date = (new DateTime())->format('Y-m-d H:i:s'); - $expectedJson = '{"date":"' . $full_date . '","level":"INFO","context":{"message":"test"},"trace":{"file":"TestCase","line":1182}}'; + $expectedJson = '{"date":"' . $full_date . '","level":"INFO","message":"","context":{"test":"test"},"trace":{"file":"TestCase","line":1182}}'; $this->assertEquals($expectedJson, $serializedMessage); } @@ -32,13 +32,14 @@ class FormatTest extends MockeryTestCase $message = new Message( level: Level::Info, trace: debug_backtrace()[0], + content: 'test', context: ['message' => 'test'], ); $format = Format::IntelliJ; $serializedMessage = $format->serialize($message); $full_date = (new DateTime())->format('Y-m-d H:i:s'); - $expected = "{$full_date} [1182] INFO - TestCase - {\"message\":\"test\"}"; + $expected = "{$full_date} [1182] INFO - TestCase - test - {\"message\":\"test\"}"; $this->assertEquals($expected, $serializedMessage); } @@ -48,7 +49,7 @@ class FormatTest extends MockeryTestCase $message = new Message( level: Level::Info, trace: debug_backtrace()[0], - context: "hello world", + content: "hello world", ); $format = Format::IntelliJ; @@ -64,13 +65,14 @@ class FormatTest extends MockeryTestCase $message = new Message( level: Level::Info, trace: debug_backtrace()[0], + content: 'test', context: ['message' => 'test'], ); $format = Format::Laravel; $serializedMessage = $format->serialize($message); $full_date = (new DateTime())->format('Y-m-d H:i:s'); - $expected = "[{$full_date}] TestCase.INFO: {\"message\":\"test\"}"; + $expected = "[{$full_date}] TestCase.INFO: test - {\"message\":\"test\"}"; $this->assertEquals($expected, $serializedMessage); } @@ -80,7 +82,7 @@ class FormatTest extends MockeryTestCase $message = new Message( level: Level::Info, trace: debug_backtrace()[0], - context: "hello world", + content: "hello world", ); $format = Format::Laravel; -- cgit v1.2.3