* @copyright 2020 DIGITAL RETAIL TECHNOLOGIES SL * @license https://opensource.org/licenses/MIT The MIT License * * Don't forget to prefix your containers with your own identifier * to avoid any conflicts with others containers. */ if (!defined('_PS_VERSION_')) { exit; } /** * Class RetailcrmLogger * @author DIGITAL RETAIL TECHNOLOGIES SL * @license GPL * @link https://retailcrm.ru */ class RetailcrmLogger { static $cloneToStdout; /** * Set to true if you want all output to be cloned into STDOUT * * @param bool $cloneToStdout */ public static function setCloneToStdout($cloneToStdout) { self::$cloneToStdout = $cloneToStdout; } /** * Write entry to log * * @param string $caller * @param string $message */ public static function writeCaller($caller, $message) { $result = sprintf( '[%s] @ [%s] %s' . PHP_EOL, date(DATE_RFC3339), $caller, $message ); error_log( $result, 3, static::getLogFile() ); if (self::$cloneToStdout) { self::output($result, ''); } } /** * Write entry to log without caller name * * @param string $message */ public static function writeNoCaller($message) { $result = sprintf( '[%s] %s' . PHP_EOL, date(DATE_RFC3339), $message ); error_log( $result, 3, static::getLogFile() ); if (self::$cloneToStdout) { self::output($result, ''); } } /** * Output message to stdout * * @param string $message * @param string $end */ public static function output($message = '', $end = PHP_EOL) { if (php_sapi_name() == 'cli') { echo $message . $end; } } /** * Write debug log record * * @param string $caller * @param mixed $message */ public static function writeDebug($caller, $message) { if (RetailcrmTools::isDebug()) { static::writeNoCaller(sprintf( '(DEBUG) <%s> %s', $caller, print_r($message, true) )); } } /** * Debug log record with multiple entries * * @param string $caller * @param array|string $messages */ public static function writeDebugArray($caller, $messages) { if (RetailcrmTools::isDebug()) { if (!empty($caller) && !empty($messages)) { $result = is_array($messages) ? substr( array_reduce( $messages, function ($carry, $item) { $carry .= ' ' . print_r($item, true); return $carry; } ), 1 ) : $messages; self::writeDebug($caller, $result); } } } /** * Returns log file path * * @return string */ public static function getLogFile() { if (!defined('_PS_ROOT_DIR_')) { return ''; } return self::getLogDir() . '/retailcrm_' . self::getLogFilePrefix() . '_' . date('Y_m_d') . '.log'; } public static function getLogDir() { return _PS_ROOT_DIR_ . '/var/logs'; } /** * Returns log file prefix based on current environment * * @return string */ private static function getLogFilePrefix() { if (php_sapi_name() == 'cli') { if (isset($_SERVER['TERM'])) { return 'cli'; } else { return 'cron'; } } return 'web'; } /** * Removes module log files from var/logs which is older than 30 days */ public static function clearObsoleteLogs() { $logDir = self::getLogDir(); $handle = opendir($logDir); while (($file = readdir($handle)) !== false) { if (false !== self::checkFileName($file)) { $path = "$logDir/$file"; if (filemtime($path) < strtotime('-30 days')) { unlink($path); } } } } public static function getLogFilesInfo() { $fileNames = []; $logDir = self::getLogDir(); $handle = opendir($logDir); while (false !== $file = readdir($handle)) { if (false !== self::checkFileName($file)) { $path = "$logDir/$file"; $fileNames[] = [ 'name' => $file, 'path' => $path, 'size' => number_format(filesize($path), 0, '.', ' ') . ' bytes', 'modified' => date('Y-m-d H:i:s', filemtime($path)), ]; } } closedir($handle); return $fileNames; } public static function checkFileName($file) { $logDir = self::getLogDir(); if (preg_match('/^retailcrm[a-zA-Z0-9-_]+.log$/', $file)) { $path = "$logDir/$file"; if (is_file($path)) { return $path; } } return false; } }