From 8b9538f1180869faf34b9b22a515cd9461fda36a Mon Sep 17 00:00:00 2001 From: Taras Machyshyn Date: Thu, 20 Mar 2014 18:06:35 +0200 Subject: [PATCH] fixed monolog errors --- api/v1/index.php | 2 - application/Espo/Core/Loaders/Log.php | 23 ++-- application/Espo/Core/Utils/Log.php | 29 +---- .../Monolog/Handler/RotatingFileHandler.php | 117 ++++++++++++++++++ .../Log/Monolog/Handler/StreamHandler.php | 66 ++++++++++ .../Espo/Core/Utils/Log/Monolog/Logger.php | 49 ++++++++ 6 files changed, 250 insertions(+), 36 deletions(-) create mode 100644 application/Espo/Core/Utils/Log/Monolog/Handler/RotatingFileHandler.php create mode 100644 application/Espo/Core/Utils/Log/Monolog/Handler/StreamHandler.php create mode 100644 application/Espo/Core/Utils/Log/Monolog/Logger.php diff --git a/api/v1/index.php b/api/v1/index.php index fa61af0342..d231e48138 100644 --- a/api/v1/index.php +++ b/api/v1/index.php @@ -1,7 +1,5 @@ getContainer()->get('config'); + $logConfig = $this->getContainer()->get('config')->get('logger'); - $logConfig = $config->get('logger'); - - $log = new Utils\Log('Espo'); - $levelCode = $log->getLevelCode($logConfig['level']); + $log = new Utils\Log('Espo'); + + $levelCode = $log->getLevelCode($logConfig['level']); if ($logConfig['isRotate']) { $handler = new Handler\RotatingFileHandler($logConfig['path'], $logConfig['maxRotateFiles'], $levelCode); @@ -54,7 +53,11 @@ class Log $handler = new Handler\StreamHandler($logConfig['path'], $levelCode); } $log->pushHandler($handler); - \Monolog\ErrorHandler::register($log); + + $errorHandler = new \Monolog\ErrorHandler($log); + $errorHandler->registerExceptionHandler(null, false); + $errorHandler->registerErrorHandler(array(), false); + $errorHandler->registerFatalHandler(); return $log; } diff --git a/application/Espo/Core/Utils/Log.php b/application/Espo/Core/Utils/Log.php index 524d4874f1..157d9a756f 100644 --- a/application/Espo/Core/Utils/Log.php +++ b/application/Espo/Core/Utils/Log.php @@ -1,4 +1,4 @@ -getLevels(); - - if (isset($levels[$levelName])) { - return $levels[$levelName]; - } - - return $levels[$this->defaultLevelName]; - } - } diff --git a/application/Espo/Core/Utils/Log/Monolog/Handler/RotatingFileHandler.php b/application/Espo/Core/Utils/Log/Monolog/Handler/RotatingFileHandler.php new file mode 100644 index 0000000000..332790bfa2 --- /dev/null +++ b/application/Espo/Core/Utils/Log/Monolog/Handler/RotatingFileHandler.php @@ -0,0 +1,117 @@ +filename = $filename; + $this->maxFiles = (int) $maxFiles; + + parent::__construct($this->getTimedFilename(), $level, $bubble); + + $this->rotate(); + } + + public function setFilenameFormat($filenameFormat, $dateFormat) + { + $this->filenameFormat = $filenameFormat; + $this->dateFormat = $dateFormat; + } + + protected function rotate() + { + if (0 === $this->maxFiles) { + return; //unlimited number of files for 0 + } + + $filePattern = $this->getFilePattern(); + $dirPath = $this->getFileManager()->getDirName($this->filename); + $logFiles = $this->getFileManager()->getFileList($dirPath, false, $filePattern, 'file'); + + if (!empty($logFiles) && count($logFiles) > $this->maxFiles) { + + usort($logFiles, function($a, $b) { + return strcmp($b, $a); + }); + + $logFilesToBeRemoved = array_slice($logFiles, $this->maxFiles); + + $this->getFileManager()->removeFiles($logFilesToBeRemoved, $dirPath); + } + } + + protected function getTimedFilename() + { + $fileInfo = pathinfo($this->filename); + $timedFilename = str_replace( + array('{filename}', '{date}'), + array($fileInfo['filename'], date($this->dateFormat)), + $fileInfo['dirname'] . '/' . $this->filenameFormat + ); + + if (!empty($fileInfo['extension'])) { + $timedFilename .= '.'.$fileInfo['extension']; + } + + return $timedFilename; + } + + protected function getFilePattern() + { + $fileInfo = pathinfo($this->filename); + $glob = str_replace( + array('{filename}', '{date}'), + array($fileInfo['filename'], '.*'), + $this->filenameFormat + ); + + if (!empty($fileInfo['extension'])) { + $glob .= '\.'.$fileInfo['extension']; + } + + $glob = '^'.$glob.'$'; + + return $glob; + } +} \ No newline at end of file diff --git a/application/Espo/Core/Utils/Log/Monolog/Handler/StreamHandler.php b/application/Espo/Core/Utils/Log/Monolog/Handler/StreamHandler.php new file mode 100644 index 0000000000..d543a83fe8 --- /dev/null +++ b/application/Espo/Core/Utils/Log/Monolog/Handler/StreamHandler.php @@ -0,0 +1,66 @@ +fileManager = new \Espo\Core\Utils\File\Manager(); + } + + protected function getFileManager() + { + return $this->fileManager; + } + + + protected function write(array $record) + { + if (!$this->url) { + throw new \LogicException('Missing logger path, the stream can not be opened. Please check logger options in the data/config.php.'); + } + + $this->errorMessage = null; + + set_error_handler(array($this, 'customErrorHandler')); + $this->getFileManager()->appendContents($this->url, (string) $record['formatted']); + restore_error_handler(); + + if (isset($this->errorMessage)) { + throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened: '.$this->errorMessage, $this->url)); + } + } + + private function customErrorHandler($code, $msg) + { + $this->errorMessage = $msg; + } + +} \ No newline at end of file diff --git a/application/Espo/Core/Utils/Log/Monolog/Logger.php b/application/Espo/Core/Utils/Log/Monolog/Logger.php new file mode 100644 index 0000000000..d11badc768 --- /dev/null +++ b/application/Espo/Core/Utils/Log/Monolog/Logger.php @@ -0,0 +1,49 @@ +getLevels(); + + if (isset($levels[$levelName])) { + return $levels[$levelName]; + } + + return $levels[$this->defaultLevelName]; + } + + +} \ No newline at end of file