Deadlock log : log inside a dedicated log file instead of creating an EventIssue object (#139)

First log implementation (75730ee) was creating EventIssue objects, and was rollbacking transaction if it exists

The new one has some benefits :

* always log one line by default in log/error.log, but details must be activated though config (channels `Deadlock-WaitTimeout` and `Deadlock-Found`)
* detailed logs are in a dedicated file (log/deadlock.log) : 
  - easier for our clients to get and share
  - has rotation by default
  - looking at the file size is a direct way to know if error happened
  - more compliant to industry standards !
* the transaction stays untouched, so that the consumer can do whatever it prefers
This commit is contained in:
Pierre Goiffon
2020-05-14 17:49:05 +02:00
committed by GitHub
parent fa3610cfee
commit 0ffa2850ea
3 changed files with 99 additions and 44 deletions

View File

@@ -704,6 +704,59 @@ class ToolsLog extends LogAPI
protected static $m_oFileLog = null;
}
/**
* @see \CMDBSource::LogDeadLock()
* @since 2.7.1
*/
class DeadLockLog extends LogAPI
{
const CHANNEL_WAIT_TIMEOUT = 'Deadlock-WaitTimeout';
const CHANNEL_DEADLOCK_FOUND = 'Deadlock-Found';
const CHANNEL_DEFAULT = self::CHANNEL_WAIT_TIMEOUT;
/** @var \FileLog we want our own instance ! */
protected static $m_oFileLog = null;
public static function Enable($sTargetFile = null)
{
if (empty($sTargetFile))
{
$sTargetFile = APPROOT.'log/deadlocks.log';
}
parent::Enable($sTargetFile);
}
private static function GetChannelFromMysqlErrorNo($iMysqlErrorNo)
{
switch ($iMysqlErrorNo)
{
case 1205:
return self::CHANNEL_WAIT_TIMEOUT;
break;
case 1213:
return self::CHANNEL_DEADLOCK_FOUND;
break;
default:
return self::CHANNEL_DEFAULT;
break;
}
}
/**
* @param int $iMySQLErrNo will be converted to channel using {@link GetChannelFromMysqlErrorNo}
* @param string $sMessage
* @param null $iMysqlErroNo
* @param array $aContext
*
* @throws \Exception
*/
public static function Log($iMySQLErrNo, $sMessage, $iMysqlErroNo = null, $aContext = array())
{
$sChannel = self::GetChannelFromMysqlErrorNo($iMysqlErroNo);
parent::Log($iMySQLErrNo, $sMessage, $sChannel, $aContext);
}
}
class LogFileRotationProcess implements iScheduledProcess
{