diff --git a/src/Utils/Logger/Logger.php b/src/Utils/Logger/Logger.php new file mode 100644 index 0000000..f12116a --- /dev/null +++ b/src/Utils/Logger/Logger.php @@ -0,0 +1,155 @@ + self::ip(), + 'date' => date('d.m.Y H:i:s'), + 'func' => '(none)', + 'version' => '(none)', + 'error' => '' + ); + } + + public static function info($info, $key = null) { + if(is_null($key)) { + self::$data = array_merge(self::$data, $info); + } else { + self::$data[$key] = $info; + } + } + + /** + * Log a message that will be displayed in the logs if the configuration + * says so. + * + * @param string $message + * @param int $verbosity + */ + public static function log($message, $verbosity = Logger::VERBOSE) { + if(Configuration::get('log.verbosity') < $verbosity) { + return; + } + + self::$log .= $message."\n"; + } + + public static function stop($data = null) { + if(! is_null($data)) { + self::info($data); + } + + $time = (microtime(true) - self::$start) * 1000; + self::$data['time'] = round($time, 2).'ms'; + + if(Configuration::get('log.verbosity') > Logger::QUIET) { + $format = Configuration::get('log.format'); + + $patterns = array_map(function($p) { return "%$p%"; }, array_keys(self::$data)); + $msg = str_replace($patterns, array_values(self::$data), $format)."\n"; + + if(strlen(self::$log) > 0) { + $msg .= self::$log; + } + + $file = Configuration::get('log.file'); + if(! file_exists($file)) { + mkdir(dirname($file), 0777, true); + touch($file); + } else { + $mtime = filemtime($file); + // start of the current day + $start = strtotime("midnight"); + + // log rotate if the last entry in the log is from yesterday + if($mtime < $start) { + $files = glob($file.'.?'); + natsort($files); + $files = array_reverse($files); + $files[] = $file; + + // we count before adding the next file + $len = count($files); + + $next = intval(substr($files[0], -1)) + 1; + $next = $next == 1 ? "$file.1" : substr($files[0], 0, -1).$next; + + array_unshift($files, $next); + for($i = 0; $i < $len; ++$i) { + // move all the log files to the next name + rename($files[$i + 1], $files[$i]); + } + + // delete all files with a number bigger than 9 + $files = glob($file.'.??'); + array_map('unlink', $files); + + // recreate the new log file + touch($file); + } + } + file_put_contents($file, $msg, FILE_APPEND | LOCK_EX); + } + } + + public static function data() { + return self::$data; + } + + public static function getLastLogs($offset = null) { + $file = Configuration::get('log.file'); + if(! file_exists($file)) { + return 'No log yet !'; + } + + $f = fopen($file, 'r'); + + $len = 8192; + + fseek($f, 0, SEEK_END); + $size = ftell($f); + if(is_null($offset) || $offset > $size) { + $offset = $size - $len; + } + $offset = max(0, $offset); + + fseek($f, $offset); + + // remove the first line that may be incomplete + $buffer = fread($f, $len); + $buffer = explode("\n", $buffer); + array_shift($buffer); + $buffer = implode("\n", $buffer); + // continue reading until the end of the file + while(! feof($f)) { + $buffer .= fread($f, $len); + } + + fclose($f); + + return $buffer; + } +}