From de0ed058ca1c22ff477dcaf3e25c41ae58106140 Mon Sep 17 00:00:00 2001 From: Clemens Schwaighofer Date: Mon, 11 Sep 2023 13:35:35 +0900 Subject: [PATCH] ErrorMessage: new flag for logging 'error' level to log --- .../CoreLibsLoggingErrorMessagesTest.php | 79 ++++++++++++++++--- www/admin/class_test.error_msg.php | 3 +- www/lib/CoreLibs/Logging/ErrorMessage.php | 57 ++++++++++++- .../CoreLibs/Logging/Logger/MessageLevel.php | 33 ++++++++ 4 files changed, 159 insertions(+), 13 deletions(-) diff --git a/4dev/tests/Logging/CoreLibsLoggingErrorMessagesTest.php b/4dev/tests/Logging/CoreLibsLoggingErrorMessagesTest.php index f81bee0e..bfec4227 100644 --- a/4dev/tests/Logging/CoreLibsLoggingErrorMessagesTest.php +++ b/4dev/tests/Logging/CoreLibsLoggingErrorMessagesTest.php @@ -200,14 +200,44 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase ); } + /** + * Undocumented function + * + * @return array + */ public function providerErrorMessageLog(): array { return [ + 'error, not logged' => [ + 'id' => '200', + 'level' => 'error', + 'str' => 'ERROR MESSAGE', + 'message' => null, + 'log_error' => null, + 'expected' => ' ERROR MESSAGE', + ], + 'error, logged' => [ + 'id' => '200', + 'level' => 'error', + 'str' => 'ERROR MESSAGE', + 'message' => null, + 'log_error' => true, + 'expected' => ' ERROR MESSAGE', + ], + 'error, logged, message' => [ + 'id' => '200', + 'level' => 'error', + 'str' => 'ERROR MESSAGE', + 'message' => 'OTHER ERROR MESSAGE', + 'log_error' => true, + 'expected' => ' OTHER ERROR MESSAGE', + ], 'crash' => [ 'id' => '300', 'level' => 'crash', 'str' => 'CRASH MESSAGE', 'message' => null, + 'log_error' => null, 'expected' => ' CRASH MESSAGE', ], 'crash, message' => [ @@ -215,6 +245,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase 'level' => 'crash', 'str' => 'CRASH MESSAGE', 'message' => 'OTHER CRASH MESSAGE', + 'log_error' => null, 'expected' => ' OTHER CRASH MESSAGE', ], 'abort' => [ @@ -222,6 +253,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase 'level' => 'abort', 'str' => 'ABORT MESSAGE', 'message' => null, + 'log_error' => null, 'expected' => ' ABORT MESSAGE', ], 'abort, message' => [ @@ -229,6 +261,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase 'level' => 'abort', 'str' => 'ABORT MESSAGE', 'message' => 'OTHER ABORT MESSAGE', + 'log_error' => null, 'expected' => ' OTHER ABORT MESSAGE', ], 'unknown' => [ @@ -236,6 +269,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase 'level' => 'wrong level', 'str' => 'WRONG LEVEL MESSAGE', 'message' => null, + 'log_error' => null, 'expected' => ' WRONG LEVEL MESSAGE', ], 'unknown, message' => [ @@ -243,6 +277,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase 'level' => 'wrong level', 'str' => 'WRONG LEVEL MESSAGE', 'message' => 'OTHER WRONG LEVEL MESSAGE', + 'log_error' => null, 'expected' => ' OTHER WRONG LEVEL MESSAGE', ], ]; @@ -254,10 +289,22 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase * @dataProvider providerErrorMessageLog * @testdox Test Log writing [$_dataName] * + * @param string $id + * @param string $level + * @param string $str + * @param string|null $message + * @param bool|null $log_error + * @param string $expected * @return void */ - public function testErrorMessageLog(string $id, string $level, string $str, ?string $message, string $expected) - { + public function testErrorMessageLog( + string $id, + string $level, + string $str, + ?string $message, + ?bool $log_error, + string $expected + ): void { $log = new \CoreLibs\Logging\Logging([ 'log_file_id' => 'testErrorMessages', 'log_folder' => self::LOG_FOLDER, @@ -269,15 +316,27 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase $id, $level, $str, - message: $message - ); - $file_content = file_get_contents( - $log->getLogFolder() . $log->getLogFile() - ) ?: ''; - $this->assertStringContainsString( - $expected, - $file_content + message: $message, + log_error: $log_error ); + $file_content = ''; + if (is_file($log->getLogFolder() . $log->getLogFile())) { + $file_content = file_get_contents( + $log->getLogFolder() . $log->getLogFile() + ) ?: ''; + } + // if n + if ($level == 'error' && ($log_error === null || $log_error === false)) { + $this->assertStringNotContainsString( + $expected, + $file_content + ); + } else { + $this->assertStringContainsString( + $expected, + $file_content + ); + } } } diff --git a/www/admin/class_test.error_msg.php b/www/admin/class_test.error_msg.php index b1731206..1d1ba0ac 100644 --- a/www/admin/class_test.error_msg.php +++ b/www/admin/class_test.error_msg.php @@ -39,7 +39,8 @@ print "FN: " . ml::fromName('Affe')->name . "
"; print "NU: " . ml::fromValue(100)->name . "
"; print "NU: " . ml::fromValue(1000)->name . "
"; -$em->setErrorMsg('123', 'error', 'msg this is bad'); +$em->setErrorMsg('123', 'error', 'msg this is bad, not logged'); +$em->setErrorMsg('123', 'error', 'msg this is bad, logged', log_error:true); $em->setErrorMsg('1000', 'info', 'This is good'); $em->setErrorMsg('9999', 'abort', 'BAD: This is critical (abort)'); $em->setErrorMsg('10-1000', 'wrong', 'Wrong level: This is emergency'); diff --git a/www/lib/CoreLibs/Logging/ErrorMessage.php b/www/lib/CoreLibs/Logging/ErrorMessage.php index cd91bc3a..2f9278ae 100644 --- a/www/lib/CoreLibs/Logging/ErrorMessage.php +++ b/www/lib/CoreLibs/Logging/ErrorMessage.php @@ -20,10 +20,21 @@ class ErrorMessage /** @var \CoreLibs\Logging\Logging $log */ public \CoreLibs\Logging\Logging $log; + /** @var bool $log_error global flag to log error level message */ + private bool $log_error = false; + + /** + * init ErrorMessage + * + * @param \CoreLibs\Logging\Logging $log + * @param bool $log_error [=false] + */ public function __construct( - \CoreLibs\Logging\Logging $log + \CoreLibs\Logging\Logging $log, + bool $log_error = false ) { $this->log = $log; + $this->log_error = $log_error; } /** @@ -50,6 +61,8 @@ class ErrorMessage * highlight points for field highlights * @param string|null $message If abort/crash, non localized $str * @param array $context Additionl info for abort/crash messages + * @param bool|null $log_error [=null] log level 'error' to error, if null use global, + * else set for this call only */ public function setErrorMsg( string $error_id, @@ -59,7 +72,11 @@ class ErrorMessage array $highlight = [], ?string $message = null, array $context = [], + ?bool $log_error = null, ): void { + if ($log_error === null) { + $log_error = $this->log_error; + } $original_level = $level; $level = MessageLevel::fromName($level)->name; // if not string set, write message string if set, else level/error id @@ -75,6 +92,14 @@ class ErrorMessage ]; // write to log for abort/crash switch ($level) { + case 'error': + if ($log_error) { + $this->log->error($message ?? $str, array_merge([ + 'id' => $error_id, + 'level' => $original_level, + ], $context)); + } + break; case 'abort': $this->log->critical($message ?? $str, array_merge([ 'id' => $error_id, @@ -109,6 +134,8 @@ class ErrorMessage * highlight points for field highlights * @param string|null $message If abort/crash, non localized $str * @param array $context Additionl info for abort/crash messages + * @param bool|null $log_error [=null] log level 'error' to error, if null use global, + * else set for this call only */ public function setMessage( string $level, @@ -118,8 +145,9 @@ class ErrorMessage array $highlight = [], ?string $message = null, array $context = [], + ?bool $log_error = null, ): void { - $this->setErrorMsg($error_id ?? '', $level, $str, $target, $highlight, $message, $context); + $this->setErrorMsg($error_id ?? '', $level, $str, $target, $highlight, $message, $context, $log_error); } // ********************************************************************* @@ -162,6 +190,31 @@ class ErrorMessage 'highlight' => [], ]; } + + // ********************************************************************* + // FLAG SETTERS + // ********************************************************************* + + /** + * Set the log error flag + * + * @param bool $flag True to log level error too, False for do not (Default) + * @return void + */ + public function setFlagLogError(bool $flag): void + { + $this->log_error = $flag; + } + + /** + * Get the current log error flag + * + * @return bool + */ + public function getFlagLogError(): bool + { + return $this->log_error; + } } // __END__ diff --git a/www/lib/CoreLibs/Logging/Logger/MessageLevel.php b/www/lib/CoreLibs/Logging/Logger/MessageLevel.php index 40f11704..b3d09278 100644 --- a/www/lib/CoreLibs/Logging/Logger/MessageLevel.php +++ b/www/lib/CoreLibs/Logging/Logger/MessageLevel.php @@ -46,6 +46,39 @@ enum MessageLevel: int { return self::tryFrom($value) ?? self::unknown; } + + /** + * Returns true if the passed $level is higher or equal to $this + * + * @param MessageLevel $level + * @return bool + */ + public function includes(MessageLevel $level): bool + { + return $this->value <= $level->value; + } + + /** + * If level is higher than set one + * + * @param MessageLevel $level + * @return bool + */ + public function isHigherThan(MessageLevel $level): bool + { + return $this->value > $level->value; + } + + /** + * if level is lower than set one + * + * @param MessageLevel $level + * @return bool + */ + public function isLowerThan(MessageLevel $level): bool + { + return $this->value < $level->value; + } } // __END__