From 35c8818dd21a8bf77d4ebdf92337d5861e9808a8 Mon Sep 17 00:00:00 2001 From: XakTuBucT Date: Fri, 18 Oct 2024 12:31:03 +0300 Subject: [PATCH] Logs --- admin/functions/func.admin.common.php | 50 ++--- class/class.logs.php | 254 ++++++++++++-------------- functions/func.logs.php | 100 +++++----- 3 files changed, 192 insertions(+), 212 deletions(-) diff --git a/admin/functions/func.admin.common.php b/admin/functions/func.admin.common.php index 3790126..d014929 100644 --- a/admin/functions/func.admin.common.php +++ b/admin/functions/func.admin.common.php @@ -53,33 +53,33 @@ { global $AVE_Template; - $logs = array(); - $logdata = array(); - $log404 = array(); - $logsql = array(); - - $_404dir = BASE_DIR . '/tmp/logs/404.php'; - $_logdir = BASE_DIR . '/tmp/logs/log.php'; - $_sqldir = BASE_DIR . '/tmp/logs/sql.php'; - - if (file_exists($_logdir)) - @eval(' ?>' . file_get_contents($_logdir) . '' . file_get_contents($_404dir) . '' . file_get_contents($_sqldir) . ' 0, + '404' => 0, + 'sql' => 0 + ]; + + $_logdir = BASE_DIR . '/tmp/logs/log.csv'; + $_404dir = BASE_DIR . '/tmp/logs/404.csv'; + $_sqldir = BASE_DIR . '/tmp/logs/sql.csv'; + + if (file_exists($_logdir)) { + $fp = file($_logdir); + $logs['logs'] = count($fp); + fclose($fp); + } - $logs['sql'] = count($logsql); + if (file_exists($_404dir)) { + $fp = file($_404dir); + $logs['404'] = count($fp); + fclose($fp); + } - unset($logdata); - unset($log404); - unset($logsql); + if (file_exists($_sqldir)) { + $fp = file($_sqldir); + $logs['sql'] = count($fp); + fclose($fp); + } // Передаем данные в шаблон для вывода $AVE_Template->assign('logs', $logs); diff --git a/class/class.logs.php b/class/class.logs.php index 1dd4a12..6e5a080 100755 --- a/class/class.logs.php +++ b/class/class.logs.php @@ -24,9 +24,9 @@ * * @public */ - public $_404dir = '/tmp/logs/404.php'; - public $_logdir = '/tmp/logs/log.php'; - public $_sqldir = '/tmp/logs/sql.php'; + public $_404dir = '/tmp/logs/404.csv'; + public $_logdir = '/tmp/logs/log.csv'; + public $_sqldir = '/tmp/logs/sql.csv'; /** * Внутренние методы класса @@ -41,21 +41,48 @@ * Метод, предназначенный для отображения всех записей Журнала событий * */ - function logList() + function logList () { global $AVE_Template; - $logdata = array(); + $file_name = BASE_DIR . $this->_logdir; + $_lines = []; - $logfile = BASE_DIR.$this->_logdir; + if (file_exists($file_name) && $fp = @fopen($file_name, 'rb')) + { + $_count = 10000; - if(file_exists($logfile)) - @eval(' ?>'.file_get_contents($logfile).' $_slice && fseek($fp, $_size - $_slice); + + while (!feof($fp)) + { + $event = fgetcsv($fp, $_slice); + + if (empty($event[0]) || count($event) < 3) { + continue; + } + + $_lines[] = [ + 'log_time' => $event['0'], + 'log_ip' => $event['1'], + 'log_url' => $event['2'], + 'log_user_id' => $event['3'], + 'log_user_name' => $event['4'], + 'log_text' => $event['5'], + 'log_type' => $event['6'], + 'log_rubric' => $event['7'] + ]; + } + + count($_lines) > $_count && $_lines = array_slice($_lines, -$_count); + } // Передаем данные в шаблон для вывода и отображаем страницу - $AVE_Template->assign('logs', $logdata); + $AVE_Template->assign('logs', $_lines); $AVE_Template->assign('content', $AVE_Template->fetch('logs/logs.tpl')); } @@ -67,17 +94,42 @@ { global $AVE_Template; - $log404 = array(); + $file_name = BASE_DIR . $this->_404dir; + $_lines = []; - $logfile = BASE_DIR . $this->_404dir; + if (file_exists($file_name) && $fp = @fopen($file_name, 'rb')) + { + $_count = 10000; - if(file_exists($logfile)) - include($logfile); + $_size = @filesize($file_name); + + $_slice = 10240; + + $_size > $_slice && fseek($fp, $_size - $_slice); - arsort($log404); + while (!feof($fp)) + { + $event = fgetcsv($fp, $_slice); + + if (empty($event[0]) || count($event) < 3) { + continue; + } + + $_lines[] = [ + 'log_time' => $event['0'], + 'log_ip' => $event['1'], + 'log_query' => $event['2'], + 'log_user_agent' => $event['3'], + 'log_user_referer' => $event['4'], + 'log_request_uri' => $event['5'] + ]; + } + + count($_lines) > $_count && $_lines = array_slice($_lines, -$_count); + } // Передаем данные в шаблон для вывода и отображаем страницу - $AVE_Template->assign('logs', $log404); + $AVE_Template->assign('logs', $_lines); $AVE_Template->assign('content', $AVE_Template->fetch('logs/404.tpl')); } @@ -89,17 +141,42 @@ { global $AVE_Template; - $logsql = array(); + $file_name = BASE_DIR . $this->_sqldir; + $_lines = []; - $logfile = BASE_DIR . $this->_sqldir; + if (file_exists($file_name) && $fp = @fopen($file_name, 'rb')) + { + $_count = 10000; - if(file_exists($logfile)) - include($logfile); + $_size = @filesize($file_name); + + $_slice = 10240; + + $_size > $_slice && fseek($fp, $_size - $_slice); - arsort($logsql); + while (!feof($fp)) + { + $event = fgetcsv($fp, $_slice); + + if (empty($event[0]) || count($event) < 3) { + continue; + } + + $_lines[] = [ + 'log_time' => $event['0'], + 'log_ip' => $event['1'], + 'log_url' => $event['2'], + 'log_user_id' => $event['3'], + 'log_user_name' => $event['4'], + 'log_text' => unserialize(base64_decode($event['5'])) + ]; + } + + count($_lines) > $_count && $_lines = array_slice($_lines, -$_count); + } // Передаем данные в шаблон для вывода и отображаем страницу - $AVE_Template->assign('logs', $logsql); + $AVE_Template->assign('logs', $_lines); $AVE_Template->assign('content', $AVE_Template->fetch('logs/sql.tpl')); } @@ -171,48 +248,20 @@ { global $AVE_Template; - // Определяем тип файла (CSV), формат имени файла, разделители и т.д. - $datstring = ''; - $dattype = 'text/csv'; - $datname = 'system_log_' . date('dmyhis', time()) . '.csv'; - - $separator = ';'; - $enclosed = '"'; - - // Выполняем запрос к БД на получение списка всех системных сообщений - $logdata=array(); - $logfile = BASE_DIR.$this->_logdir; - if(file_exists($logfile)) - @eval(' ?>'.file_get_contents($logfile).'$v) - $datstring .= $enclosed . $k . $enclosed . $separator; - $datstring .= PHP_EOL; - - // Циклически обрабатываем данные и формируем CSV файл с учетом указаны выше параметров - foreach($logdata as $k=>$v) - { - foreach ($v as $key => $val) - { - $val = ($key=='log_time') ? date('d-m-Y, H:i:s', $val) : $val; - $datstring .= ($val == '') ? $separator : $enclosed . stripslashes($val) . $enclosed . $separator; - } - $datstring .= PHP_EOL; - } + $file_name = BASE_DIR . $this->_logdir; + $dateName = 'system_log_' . date('dmyhis', time()) . '.csv'; // Определяем заголовки документа header('Content-Encoding: windows-1251'); header('Content-type: text/csv; charset=windows-1251'); header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); - header('Content-Disposition: attachment; filename="' . $datname . '"'); - header('Content-Length: ' . strlen($datstring)); + header('Content-Disposition: attachment; filename="' . $dateName . '"'); + header('Content-Length: ' . filesize($file_name)); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); // Выводим данные - echo mb_convert_encoding($datstring, 'windows-1251', 'UTF-8'); + readfile($file_name); // Сохраняем системное сообщение в журнал reportLog($AVE_Template->get_config_vars('LOGS_EXPORT')); @@ -228,56 +277,23 @@ { global $AVE_Template; - // Определяем тип файла (CSV), формат имени файла, разделители и т.д. - $datstring = ''; - $dattype = 'text/csv'; - $datname = 'system_log_' . date('dmyhis', time()) . '.csv'; - - $separator = ';'; - $enclosed = '"'; - - // Выполняем запрос к БД на получение списка всех системных сообщений - $log404 = array(); - - $logfile = BASE_DIR.$this->_404dir; - - if(file_exists($logfile)) - include($logfile); - - arsort($log404); - - $fieldcount = count($log404[0]); - - foreach($log404[0] as $k=>$v) - $datstring .= $enclosed . $k . $enclosed . $separator; - - $datstring .= PHP_EOL; - - // Циклически обрабатываем данные и формируем CSV файл с учетом указаны выше параметров - foreach($log404 as $k=>$v) - { - foreach ($v as $key => $val) - { - $val = ($key=='log_time') ? date('d-m-Y, H:i:s', $val) : $val; - $datstring .= ($val == '') ? $separator : $enclosed . stripslashes($val) . $enclosed . $separator; - } - $datstring .= PHP_EOL; - } + $file_name = BASE_DIR . $this->_404dir; + $dateName = 'system_log_' . date('dmyhis', time()) . '.csv'; // Определяем заголовки документа header('Content-Encoding: windows-1251'); header('Content-type: text/csv; charset=windows-1251'); header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); - header('Content-Disposition: attachment; filename="' . $datname . '"'); - header('Content-Length: ' . strlen($datstring)); + header('Content-Disposition: attachment; filename="' . $dateName . '"'); + header('Content-Length: ' . filesize($file_name)); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); // Выводим данные - echo mb_convert_encoding(strip_tags($datstring), 'windows-1251', 'UTF-8'); + readfile($file_name); // Сохраняем системное сообщение в журнал - reportLog($AVE_Template->get_config_vars('LOGS_404_EXPORT')); + reportLog($AVE_Template->get_config_vars('LOGS_EXPORT')); exit; } @@ -290,60 +306,24 @@ { global $AVE_Template; - // Определяем тип файла (CSV), формат имени файла, разделители и т.д. - $datstring = ''; - $dattype = 'text/csv'; - $datname = 'system_log_' . date('dmyhis', time()) . '.csv'; - - $separator = ';'; - $enclosed = '"'; - - // Выполняем запрос к БД на получение списка всех системных сообщений - $logsql = array(); - - $logfile = BASE_DIR . $this->_sqldir; - - if(file_exists($logfile)) - include($logfile); - - arsort($logsql); - - $fieldcount = count($logsql[0]); - - foreach($logsql[0] as $k=>$v) - $datstring .= $enclosed . $k . $enclosed . $separator; - - $datstring .= PHP_EOL; - - // Циклически обрабатываем данные и формируем CSV файл с учетом указаны выше параметров - foreach($logsql as $k => $v) - { - foreach ($v as $key => $val) - { - $val = ($key == 'log_time') ? date('d-m-Y, H:i:s', $val) : $val; - $val = ($key == 'log_text') ? serialize($val) : $val; - $datstring .= ($val == '') ? $separator : $enclosed . stripslashes($val) . $enclosed . $separator; - } - $datstring .= PHP_EOL; - } + $file_name = BASE_DIR . $this->_sqldir; + $dateName = 'system_log_' . date('dmyhis', time()) . '.csv'; // Определяем заголовки документа header('Content-Encoding: windows-1251'); header('Content-type: text/csv; charset=windows-1251'); header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); - header('Content-Disposition: attachment; filename="' . $datname . '"'); - header('Content-Length: ' . strlen($datstring)); + header('Content-Disposition: attachment; filename="' . $dateName . '"'); + header('Content-Length: ' . filesize($file_name)); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); // Выводим данные - echo mb_convert_encoding(strip_tags($datstring), 'windows-1251', 'UTF-8'); + readfile($file_name); // Сохраняем системное сообщение в журнал - reportLog($AVE_Template->get_config_vars('LOGS_SQL_EXPORT')); + reportLog($AVE_Template->get_config_vars('LOGS_EXPORT')); exit; } - - } -?> \ No newline at end of file + } \ No newline at end of file diff --git a/functions/func.logs.php b/functions/func.logs.php index f261eda..bd332c6 100755 --- a/functions/func.logs.php +++ b/functions/func.logs.php @@ -18,95 +18,95 @@ * @param string $message Текст сообщения * @param int $typ тип сообщения * @param int $rub номер рубрики - * @return + * @return void */ - function reportLog($message, $typ = 0, $rub = 0) + function reportLog(string $message, int $typ = 0, int $rub = 0) { - $logdata=array(); + $logfile = BASE_DIR . '/tmp/logs/log.csv'; - $logfile = BASE_DIR . '/tmp/logs/log.php'; - - if (file_exists($logfile)) - @eval(' ?'.'>' . file_get_contents($logfile) . ' time(), 'log_ip' => $_SERVER['REMOTE_ADDR'], 'log_url' => $_SERVER['REQUEST_URI'], - 'log_user_id' => (isset($_SESSION['user_id']) ? $_SESSION['user_id'] : '0'), - 'log_user_name' => (isset($_SESSION['user_name']) ? $_SESSION['user_name'] : 'Anonymous'), + 'log_user_id' => ($_SESSION['user_id'] ?? '0'), + 'log_user_name' => ($_SESSION['user_name'] ?? 'Anonymous'), 'log_text' => $message, 'log_type' => (int)$typ, 'log_rubric' => (int)$rub - ); - - $messlimit = 1000; - - $logdata = array_slice($logdata,-1*$messlimit); - - file_put_contents($logfile,''); + ]; + + if ($f_log = @fopen($logfile, 'ab')) + { + if (flock($f_log, LOCK_EX)) + { + fputcsv($f_log, $logData); + flock($f_log, LOCK_UN); + } + + fclose($f_log); + } } /** * Запись события в лог для Sql ошибок * * @param string $message Текст сообщения - * @return + * @return void */ function reportSqlLog($message) { - $logsql = array(); - - $logfile = BASE_DIR . '/tmp/logs/sql.php'; + $logfile = BASE_DIR . '/tmp/logs/sql.csv'; - if (file_exists($logfile)) - @eval(' ?'.'>' . file_get_contents($logfile) . ' time(), 'log_ip' => $_SERVER['REMOTE_ADDR'], 'log_url' => $_SERVER['REQUEST_URI'], 'log_user_id' => $_SESSION['user_id'], 'log_user_name' => $_SESSION['user_name'], - 'log_text' => $message - ); - - $messlimit = 1000; - - $logsql = array_slice($logsql,-1*$messlimit); - - file_put_contents($logfile, ''); + 'log_text' => base64_encode(serialize($message)) + ]; + + if ($f_log = @fopen($logfile, 'ab')) + { + if (flock($f_log, LOCK_EX)) + { + fputcsv($f_log, $logData); + flock($f_log, LOCK_UN); + } + + fclose($f_log); + } } /** * Запись события в лог для 404 ошибок * * @param string $message Текст сообщения - * @return + * @return void */ function report404() { - $log404 = array(); - - $logfile = BASE_DIR . '/tmp/logs/404.php'; - - if (file_exists($logfile)) - @include($logfile); + $logfile = BASE_DIR . '/tmp/logs/404.csv'; - $log404[] = array( + $logData = [ 'log_time' => time(), 'log_ip' => @$_SERVER['REMOTE_ADDR'], 'log_query' => @$_SERVER['REQUEST_URI'], 'log_user_agent' => @$_SERVER['HTTP_USER_AGENT'], - 'log_user_referer' => (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''), + 'log_user_referer' => ($_SERVER['HTTP_REFERER'] ?? ''), 'log_request_uri' => @$_SERVER['REQUEST_URI'] - ); - - $messlimit = 1000; - - $log404 = array_slice($log404, -1*$messlimit); - - file_put_contents($logfile,''); + ]; + + if ($f_log = @fopen($logfile, 'ab')) + { + if (flock($f_log, LOCK_EX)) + { + fputcsv($f_log, $logData); + flock($f_log, LOCK_UN); + } + + fclose($f_log); + } } ?> \ No newline at end of file