diff --git a/core/log.class.inc.php b/core/log.class.inc.php index 2ee0aa117..f652d77c6 100644 --- a/core/log.class.inc.php +++ b/core/log.class.inc.php @@ -656,9 +656,9 @@ abstract class LogAPI * @throws \ConfigException if log wrongly configured * @uses GetMinLogLevel */ - final public static function IsLogLevelEnabled(string $sLevel, string $sChannel, string $code = 'log_level_min'): bool + final public static function IsLogLevelEnabled(string $sLevel, string $sChannel, string $sCode = 'log_level_min'): bool { - $sMinLogLevel = self::GetMinLogLevel($sChannel, $code); + $sMinLogLevel = self::GetMinLogLevel($sChannel, $sCode); if ($sMinLogLevel === false || $sMinLogLevel === 'false') { return false; @@ -678,6 +678,7 @@ abstract class LogAPI /** * @param string $sChannel + * @param string $sCode * * @return string one of the LEVEL_* const value : the one configured it if exists, otherwise default log level for this channel * Config can be set : @@ -697,14 +698,14 @@ abstract class LogAPI * * @link https://www.itophub.io/wiki/page?id=3_0_0%3Aadmin%3Alog iTop log reference */ - protected static function GetMinLogLevel($sChannel, $code = 'log_level_min') + protected static function GetMinLogLevel($sChannel, $sCode = 'log_level_min') { $oConfig = static::GetConfig(); if (!$oConfig instanceof Config) { return static::GetLevelDefault(); } - $sLogLevelMin = $oConfig->Get($code); + $sLogLevelMin = $oConfig->Get($sCode); if (empty($sLogLevelMin)) { return static::GetLevelDefault(); @@ -1106,13 +1107,14 @@ class LogFileRotationProcess implements iScheduledProcess /** * Log exceptions using dedicated API and logic. * - * Please use {@see ExceptionLog::ExceptionLog()} to log exceptions + * Please use {@see ExceptionLog::LogException()} to log exceptions * - * @Since 3.0.0 + * @since 3.0.0 */ class ExceptionLog extends LogAPI { const CHANNEL_DEFAULT = 'Exception'; + const CONTEXT_EXCEPTION = '__exception'; private static $oLastEventIssue = null; @@ -1121,23 +1123,24 @@ class ExceptionLog extends LogAPI /** * This method should be used to write logs. * - * As it encapsulate the operations performed using the Exception, you should prefer it to the standard API inherited from LogApi `ExceptionLog::Error($oException->getMessage(), get_class($oException), ['exception' => $oException]);` + * As it encapsulate the operations performed using the Exception, you should prefer it to the standard API inherited from LogApi `ExceptionLog::Error($oException->getMessage(), get_class($oException), ['__exception' => $oException]);` * The parameter order is not standard, but in our use case, the resulting API is way more convenient this way. */ - public static function FromException(Exception $oException, $aContext = array(), $sLevel = self::LEVEL_WARNING) + public static function LogException(Exception $oException, $aContext = array(), $sLevel = self::LEVEL_WARNING) { - if (empty($aContext['exception'])) { - $aContext['exception'] = $oException; + if (empty($aContext[self::CONTEXT_EXCEPTION])) { + $aContext[self::CONTEXT_EXCEPTION] = $oException; } if (empty($aContext['exception class'])) { $aContext['exception class'] = get_class($oException); } - return self::Log($sLevel, $oException->getMessage(), get_class($oException), $aContext); + self::Log($sLevel, $oException->getMessage(), get_class($oException), $aContext); } /** + * @inheritDoc * @throws \ConfigException if log wrongly configured */ public static function Log($sLevel, $sMessage, $sClass = null, $aContext = array()) @@ -1155,7 +1158,7 @@ class ExceptionLog extends LogAPI $sChannel = self::FindClassChannel($sClass); if (static::IsLogLevelEnabled($sLevel, $sChannel)) { - static::$m_oFileLog->$sLevel($sMessage, $sChannel, $aContext); + static::$m_oFileLog->$sLevel($sMessage, $sChannel, array_diff_key($aContext, [self::CONTEXT_EXCEPTION => null])); //The exception should not be included in the error.log because of its verbosity. } $sDbChannel = self::FindClassChannel($sClass, 'log_level_min.write_in_db'); @@ -1165,15 +1168,14 @@ class ExceptionLog extends LogAPI } - - protected static function FindClassChannel($sClass, $code = 'log_level_min') + protected static function FindClassChannel($sClass, $sCode = 'log_level_min') { $oConfig = static::GetConfig(); if (!$oConfig instanceof Config) { return static::GetLevelDefault(); } - $sLogLevelMin = $oConfig->Get($code); + $sLogLevelMin = $oConfig->Get($sCode); if (empty($sLogLevelMin)) { return $sClass; @@ -1200,6 +1202,9 @@ class ExceptionLog extends LogAPI return $sClass; } + /** + * @inheritDoc + */ public static function Enable($sTargetFile = null) { if (empty($sTargetFile)) @@ -1211,7 +1216,9 @@ class ExceptionLog extends LogAPI private static function WriteToDb(array $aContext): void { - $exception = $aContext['exception']; + $exception = $aContext[self::CONTEXT_EXCEPTION]; + unset($aContext[self::CONTEXT_EXCEPTION]); + if (MetaModel::IsLogEnabledIssue()) { if (MetaModel::IsValidClass('EventIssue')) { try { @@ -1238,9 +1245,9 @@ class ExceptionLog extends LogAPI } /** - * used by the tests + * @internal Used by the tests */ - private static function getLastEventIssue() + private static function GetLastEventIssue() { return self::$oLastEventIssue; } diff --git a/test/core/Log/ExceptionLogTest.php b/test/core/Log/ExceptionLogTest.php index e274e2455..b481f4b16 100644 --- a/test/core/Log/ExceptionLogTest.php +++ b/test/core/Log/ExceptionLogTest.php @@ -70,7 +70,7 @@ class ExceptionLogTest extends ItopDataTestCase $oException = new $aExceptions[$i]("Iteration number $i"); $iExpectedWriteNumber = $aExpectedWriteNumber[$i]; $iExpectedDbWriteNumber = $aExpectedDbWriteNumber[$i]; - $aExpectedFileContext = array_merge($aContext, ['__exception class' => get_class($oException)]); //The context is preserved, and, if the key '__exception' is not yet in the array, it is added + $aExpectedFileContext = array_merge($aContext, ['exception class' => get_class($oException)]); //The context is preserved, and, if the key 'exception class' is not yet in the array, it is added $mockFileLog->expects($this->exactly($iExpectedWriteNumber)) ->method($sLevel) ->with($oException->GetMessage(), $sChannel, $aExpectedFileContext)