From a9102b36637e7e988f96726c930cee765a258725 Mon Sep 17 00:00:00 2001 From: rylon Date: Mon, 23 Dec 2013 04:26:00 +0100 Subject: [PATCH] more log fixes, sai log sql fixes, dbd sql --- dbd/sql/mysql/data/sai_api.sql | 30 +++++ dbd/sql/pg/data/sai_api.sql | 7 + log/error_handler/error_handler_dbwriter.php | 15 ++- .../error_handler_jsonoutput.php | 3 +- log/exceptions/COUNTER.php | 5 + ...ErrorException.php => ERROR_EXCEPTION.php} | 0 log/exceptions/SHUTDOWN_EXCEPTION.php | 4 + ...ception.php => SYSTEM_ERROR_EXCEPTION.php} | 5 +- log/log.php | 18 +-- .../saimod_sys_log/img/ajax-loader.gif | Bin 0 -> 723 bytes sai/modules/saimod_sys_log/saimod_sys_log.js | 2 + sai/modules/saimod_sys_log/saimod_sys_log.php | 126 ++++++++++++------ sai/modules/saimod_sys_log/saimod_sys_log.tpl | 2 +- 13 files changed, 152 insertions(+), 65 deletions(-) create mode 100644 dbd/sql/mysql/data/sai_api.sql create mode 100644 log/exceptions/COUNTER.php rename log/exceptions/{ErrorException.php => ERROR_EXCEPTION.php} (100%) create mode 100644 log/exceptions/SHUTDOWN_EXCEPTION.php rename log/exceptions/{ShutdownException.php => SYSTEM_ERROR_EXCEPTION.php} (85%) create mode 100644 sai/modules/saimod_sys_log/img/ajax-loader.gif diff --git a/dbd/sql/mysql/data/sai_api.sql b/dbd/sql/mysql/data/sai_api.sql new file mode 100644 index 0000000..5f436ea --- /dev/null +++ b/dbd/sql/mysql/data/sai_api.sql @@ -0,0 +1,30 @@ +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (0, 42, 0, -1, NULL, 'sai_mod', NULL); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (1, 42, 1, 0, NULL, 'js', NULL); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (2, 42, 1, 0, NULL, 'css', NULL); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (3, 42, 0, 0, NULL, 'action', NULL); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (10, 42, 2, 3, 'login', 'username', 'ALL'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (11, 42, 2, 3, 'login', 'password_sha', 'ALL'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (12, 42, 2, 3, 'login', 'password_md5', 'ALL'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (20, 42, 2, 3, 'register', 'username', 'ALL'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (21, 42, 2, 3, 'register', 'password', 'ALL'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (30, 42, 2, 3, 'edit', 'id', 'ALL'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (23, 42, 2, 3, 'register', 'email', 'ALL'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (24, 42, 3, 3, 'register', 'locale', 'ALL'); + +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (31, 42, 2, 3, 'edit', 'lang', 'LANG'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (32, 42, 2, 3, 'edit', 'newtext', 'ALL'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (33, 42, 2, 3, 'delete', 'id', 'ALL'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (34, 42, 2, 3, 'editmode', 'entry', 'ALL'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (35, 42, 2, 3, 'add', 'id', 'ALL'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (36, 42, 2, 3, 'add', 'category', 'INT'); + +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (40, 42, 2, 3, 'upload', 'cat', 'STRING'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (41, 42, 2, 3, 'del', 'cat', 'STRING'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (42, 42, 2, 3, 'del', 'id', 'STRING'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (43, 42, 2, 3, 'rn', 'cat', 'STRING'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (44, 42, 2, 3, 'rn', 'id', 'STRING'); +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (45, 42, 2, 3, 'rn', 'newid', 'STRING'); + +INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (50, 42, 3, 3, 'filter', 'filter', 'STRING'); + +-- INSERT INTO system.api ("ID", "group", type, "parentID", "parentValue", name, verify) VALUES (302, 42, 4, -1, NULL, '_lang', 'LANG'); \ No newline at end of file diff --git a/dbd/sql/pg/data/sai_api.sql b/dbd/sql/pg/data/sai_api.sql index 275dbe0..f2e7494 100644 --- a/dbd/sql/pg/data/sai_api.sql +++ b/dbd/sql/pg/data/sai_api.sql @@ -19,3 +19,10 @@ INSERT INTO system.api ("ID", "group", type, "parentID", "parentValue", name, ve INSERT INTO system.api ("ID", "group", type, "parentID", "parentValue", name, verify) VALUES (36, 42, 2, 3, 'add', 'category', 'INT'); INSERT INTO system.api ("ID", "group", type, "parentID", "parentValue", name, verify) VALUES (40, 42, 3, 3, 'filter', 'filter', 'STRING'); INSERT INTO system.api ("ID", "group", type, "parentID", "parentValue", name, verify) VALUES (302, 42, 4, -1, NULL, '_lang', 'LANG'); + +-- INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (40, 42, 2, 3, 'upload', 'cat', 'STRING'); +-- INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (41, 42, 2, 3, 'del', 'cat', 'STRING'); +-- INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (42, 42, 2, 3, 'del', 'id', 'STRING'); +-- INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (43, 42, 2, 3, 'rn', 'cat', 'STRING'); +-- INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (44, 42, 2, 3, 'rn', 'id', 'STRING'); +-- INSERT INTO `system_api` (`ID`, `group`, `type`, `parentID`, `parentValue`, `name`, `verify`) VALUES (45, 42, 2, 3, 'rn', 'newid', 'STRING'); \ No newline at end of file diff --git a/log/error_handler/error_handler_dbwriter.php b/log/error_handler/error_handler_dbwriter.php index 2b47a2e..092146e 100644 --- a/log/error_handler/error_handler_dbwriter.php +++ b/log/error_handler/error_handler_dbwriter.php @@ -6,7 +6,7 @@ namespace SYSTEM\LOG; //And only the first ErrorHandler will be called if he returns true in CALL. class error_handler_dbwriter extends \SYSTEM\LOG\error_handler { public static function CALL(\Exception $E, $thrown){ - try{ + try{ if(\property_exists(get_class($E), 'logged') && $E->logged){ return false;} //alrdy logged @@ -20,10 +20,13 @@ class error_handler_dbwriter extends \SYSTEM\LOG\error_handler { } else { $con = new \SYSTEM\DB\Connection(\SYSTEM\system::getSystemDBInfo()); $con->prepare( 'sysLogStmt', 'INSERT INTO system_log '. - '(class, message, code, file, line, trace, ip, querytime, time) '. - 'VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);', + '(class, message, code, file, line, trace, ip, querytime, time, server_name, server_port, request_uri, post, http_referer, http_user_agent, user, thrown) '. + 'VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);', array( get_class($E), $E->getMessage(), $E->getCode(), $E->getFile(), $E->getLine(), $E->getTraceAsString(), - getenv('REMOTE_ADDR'),round(microtime(true) - \SYSTEM\time::getStartTime(),5),microtime(true))); + getenv('REMOTE_ADDR'),round(microtime(true) - \SYSTEM\time::getStartTime(),5),date('Y-m-d H:i:s', microtime(true)), + $_SERVER["SERVER_NAME"],$_SERVER["SERVER_PORT"],$_SERVER['REQUEST_URI'], serialize($_POST), + array_key_exists('HTTP_REFERER', $_SERVER) ? $_SERVER['HTTP_REFERER'] : null,$_SERVER['HTTP_USER_AGENT'], + ($user = \SYSTEM\SECURITY\Security::getUser()) ? $user->id : null,$thrown)); } if(\property_exists(get_class($E), 'logged')){ @@ -31,7 +34,5 @@ class error_handler_dbwriter extends \SYSTEM\LOG\error_handler { } catch (\Exception $E){} //Error -> Ignore return false; //We just log and do not handle the error! - } - public static function MASK(){ - return \SYSTEM\CONFIG\config::get(\SYSTEM\CONFIG\config_ids::SYS_CONFIG_ERRORREPORTING);} + } } \ No newline at end of file diff --git a/log/error_handler/error_handler_jsonoutput.php b/log/error_handler/error_handler_jsonoutput.php index 89112ea..2058311 100644 --- a/log/error_handler/error_handler_jsonoutput.php +++ b/log/error_handler/error_handler_jsonoutput.php @@ -3,8 +3,7 @@ namespace SYSTEM\LOG; class error_handler_jsonoutput extends \SYSTEM\LOG\error_handler { - //Only those who die! - public static function MASK(){ return \E_ALL;} //\E_ERROR | \E_USER_ERROR | \E_CORE_ERROR | \E_COMPILE_ERROR; } + //Only those who die! public static function CALL(\Exception $E, $thrown){ if($thrown){ try{ diff --git a/log/exceptions/COUNTER.php b/log/exceptions/COUNTER.php new file mode 100644 index 0000000..b7799d8 --- /dev/null +++ b/log/exceptions/COUNTER.php @@ -0,0 +1,5 @@ +getCode())) && - \call_user_func_array(array($handler,self::HANDLER_FUNC_CALL),array($E, $thrown))){ - return true;} - } - return false; + foreach(self::$handlers as $handler){ + if( \call_user_func_array(array($handler,self::HANDLER_FUNC_CALL),array($E, $thrown))){ + return true;}} + return false; } public static function __exception_handler(\Exception $E, $thrown = true){ return self::call_handlers($E, $thrown) && $thrown;} public static function __error_handler($code, $message, $file, $line, $thrown = true){ - return self::call_handlers(new \SYSTEM\LOG\ErrorException($message, 1, $code, $file, $line) ,$thrown);} + return self::call_handlers(new \SYSTEM\LOG\ERROR_EXCEPTION($message, 1, $code, $file, $line) ,$thrown);} public static function __shutdown_handler($thrown = true) { if( ($error = error_get_last()) !== NULL && !$error['type'] === E_DEPRECATED) { //http://www.dreamincode.net/forums/topic/284506-having-trouble-supressing-magic-quotes-gpc-fatal-errors/ - return self::call_handlers(new \SYSTEM\LOG\ShutdownException($error["message"], 1, $error["type"],$error["file"],$error["line"]) ,$thrown);} + return self::call_handlers(new \SYSTEM\LOG\SHUTDOWN_EXCEPTION($error["message"], 1, $error["type"],$error["file"],$error["line"]) ,$thrown);} } public static function __fatal_error_handler($bufferContent, $thrown = true){ diff --git a/sai/modules/saimod_sys_log/img/ajax-loader.gif b/sai/modules/saimod_sys_log/img/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..442b8d207fc349d4f4859fdb459f160fdf29f703 GIT binary patch literal 723 zcmZ?wbhEHb6kyD!?H2$M zU}whwS0g!1d@9(>e!%W{WeX1(&Pu-QF>ukNt^Y z`<6!zCwTOV*InasT|3PQYA7SJ2`UMR608aHR%FVwPuzFl)}fVeE-mkU{$}s%-4Xg4 zb66X#1v@2}pc)xd`H%Jj`5(~0PMv(BhwkhJ7OW@=k9+#4WLS0X8 ziG5@h_jcNC#query('SELECT time::date as day, - min(time) as time_min, max(time) as time_max, - count(*) as count, - avg(querytime) as querytime_avg, - max(querytime) as querytime_max, - min(querytime) as querytime_min, - count(distinct file) as file_unique, - count(distinct ip) as ip_unique, - count(distinct message) as text_unique, - count(distinct class) as class_unique, - sum(case when class = \'INFO\' then 1 else 0 end) class_INFO, - sum(case when class = \'DEPRECATED\' then 1 else 0 end) class_DEPRECATED, - sum(case when class = \'WARNING\' then 1 else 0 end) class_WARNING, - sum(case when class = \'ERROR\' then 1 else 0 end) class_ERROR, - sum(case when class = \'AppError\' then 1 else 0 end) class_AppError, - sum(case when class = \'SYSTEM\LOG\INFO\' then 1 else 0 end) class_SYSTEM_LOG_INFO, - sum(case when class = \'SYSTEM\LOG\DEPRECATED\' then 1 else 0 end) class_SYSTEM_LOG_DEPRECATED, - sum(case when class = \'SYSTEM\LOG\WARNING\' then 1 else 0 end) class_SYSTEM_LOG_WARNING, - sum(case when class = \'SYSTEM\LOG\ERROR\' then 1 else 0 end) class_SYSTEM_LOG_ERROR, - sum(case when class = \'SYSTEM\LOG\ErrorException\' then 1 else 0 end) class_SYSTEM_LOG_ErrorException, - sum(case when class = \'SYSTEM\LOG\ShutdownException\' then 1 else 0 end) class_SYSTEM_LOG_ShutdownException, - sum(case when class = \'Exception\' then 1 else 0 end) class_Exception, - sum(case when class = \'RuntimeException\' then 1 else 0 end) class_RuntimeException, - sum(case when class = \'ErrorException\' then 1 else 0 end) class_ErrorException - from system.sys_log - group by day - order by day desc - limit 365;'); + if(\SYSTEM\system::isSystemDbInfoPG()){ + $res = $con->query('SELECT time::date as day, + min(time) as time_min, max(time) as time_max, + count(*) as count, + avg(querytime) as querytime_avg, + max(querytime) as querytime_max, + min(querytime) as querytime_min, + count(distinct file) as file_unique, + count(distinct ip) as ip_unique, + count(distinct message) as text_unique, + count(distinct class) as class_unique, + sum(case when class = \'INFO\' then 1 else 0 end) class_INFO, + sum(case when class = \'DEPRECATED\' then 1 else 0 end) class_DEPRECATED, + sum(case when class = \'WARNING\' then 1 else 0 end) class_WARNING, + sum(case when class = \'ERROR\' then 1 else 0 end) class_ERROR, + sum(case when class = \'AppError\' then 1 else 0 end) class_AppError, + sum(case when class = \'SYSTEM\LOG\INFO\' then 1 else 0 end) class_SYSTEM_LOG_INFO, + sum(case when class = \'SYSTEM\LOG\DEPRECATED\' then 1 else 0 end) class_SYSTEM_LOG_DEPRECATED, + sum(case when class = \'SYSTEM\LOG\WARNING\' then 1 else 0 end) class_SYSTEM_LOG_WARNING, + sum(case when class = \'SYSTEM\LOG\ERROR\' then 1 else 0 end) class_SYSTEM_LOG_ERROR, + sum(case when class = \'SYSTEM\LOG\ErrorException\' then 1 else 0 end) class_SYSTEM_LOG_ErrorException, + sum(case when class = \'SYSTEM\LOG\ShutdownException\' then 1 else 0 end) class_SYSTEM_LOG_ShutdownException, + sum(case when class = \'Exception\' then 1 else 0 end) class_Exception, + sum(case when class = \'RuntimeException\' then 1 else 0 end) class_RuntimeException, + sum(case when class = \'ErrorException\' then 1 else 0 end) class_ErrorException + from system.sys_log + group by day + order by day desc + limit 365;'); + } else { + $res = $con->query('SELECT DATE(time) as day, + min(time) as time_min, max(time) as time_max, + count(*) as count, + avg(querytime) as querytime_avg, + max(querytime) as querytime_max, + min(querytime) as querytime_min, + count(distinct file) as file_unique, + count(distinct ip) as ip_unique, + count(distinct message) as text_unique, + count(distinct class) as class_unique, + sum(case when class = \'INFO\' then 1 else 0 end) class_INFO, + sum(case when class = \'DEPRECATED\' then 1 else 0 end) class_DEPRECATED, + sum(case when class = \'WARNING\' then 1 else 0 end) class_WARNING, + sum(case when class = \'ERROR\' then 1 else 0 end) class_ERROR, + sum(case when class = \'AppError\' then 1 else 0 end) class_AppError, + sum(case when class = \'SYSTEM\LOG\INFO\' then 1 else 0 end) class_SYSTEM_LOG_INFO, + sum(case when class = \'SYSTEM\LOG\DEPRECATED\' then 1 else 0 end) class_SYSTEM_LOG_DEPRECATED, + sum(case when class = \'SYSTEM\LOG\WARNING\' then 1 else 0 end) class_SYSTEM_LOG_WARNING, + sum(case when class = \'SYSTEM\LOG\ERROR\' then 1 else 0 end) class_SYSTEM_LOG_ERROR, + sum(case when class = \'SYSTEM\LOG\ErrorException\' then 1 else 0 end) class_SYSTEM_LOG_ErrorException, + sum(case when class = \'SYSTEM\LOG\ShutdownException\' then 1 else 0 end) class_SYSTEM_LOG_ShutdownException, + sum(case when class = \'Exception\' then 1 else 0 end) class_Exception, + sum(case when class = \'RuntimeException\' then 1 else 0 end) class_RuntimeException, + sum(case when class = \'ErrorException\' then 1 else 0 end) class_ErrorException + from system_log + group by day + order by day desc + limit 365;'); + } $result = array(); while($row = $res->next()){ $result[] = $row;} @@ -61,28 +92,34 @@ class saimod_sys_log extends \SYSTEM\SAI\SaiModule { array($filter)); } else { $res = $con->prepare( 'selectSysLogFilter', - 'SELECT * FROM system_log WHERE class LIKE ? ORDER BY time DESC LIMIT 100;', - array($filter)); + 'SELECT * FROM system_log LEFT JOIN system_user ON system_log.user = system_user.id WHERE class LIKE ? ORDER BY time DESC LIMIT 100;', + array(mysql_escape_string($filter))); } } else { if(\SYSTEM\system::isSystemDbInfoPG()){ $res = $con->query('SELECT * FROM system.sys_log ORDER BY time DESC LIMIT 100;'); } else { - $res = $con->query('SELECT * FROM system_log ORDER BY time DESC LIMIT 100;'); + $res = $con->query('SELECT * FROM system_log LEFT JOIN system_user ON system_log.user = system_user.id ORDER BY time DESC LIMIT 100;'); } } $now = microtime(true); $result = ''. - ''.''.''.''.''.''.''.''.''.''; - while($r = $res->next()){ - //TODO make time conversion on database - if(\SYSTEM\system::isSystemDbInfoPG()){ - $result .= ''.''.''.''.''.''.''.''.''.''.''; - } else { - $result .= ''.''.''.''.''.''.''.''.''.''.''; - } + ''.''.''.''.''.''.''.''.''.''; + while($r = $res->next()){ + //print_r($r); + $result .= ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''; } $result .= '
'.'time ago'.''.'time'.''.'class'.''.'message'.''.'code'.''.'file'.''.'line'.''.'ip'.''.'querytime'.'
'.self::time_elapsed_string(strtotime($r['time'])).''.$r['time'].''.$r['class'].''.substr($r['message'],0,255).''.$r['code'].''.$r['file'].''.$r['line'].''.$r['ip'].''.$r['querytime'].'
'.self::time_elapsed_string($r['time']).''.$r['time'].''.$r['class'].''.substr($r['message'],0,255).''.$r['code'].''.$r['file'].''.$r['line'].''.$r['ip'].''.$r['querytime'].'
'.'time ago'.''.'class'.''.'message'.''.'file'.''.'line'.''.'ip'.''.'url'.''.'user'.''.'querytime'.'
'.self::time_elapsed_string(strtotime($r['time'])).''.$r['class'].''.substr($r['message'],0,255).''.$r['file'].''.$r['line'].''.$r['ip'].''.$r['server_name'].':'.$r['server_port'].$r['request_uri'].''.$r['username'].''.$r['querytime'].'
'; @@ -112,7 +149,11 @@ class saimod_sys_log extends \SYSTEM\SAI\SaiModule { private static function generate_error_filters(){ $con = new \SYSTEM\DB\Connection(\SYSTEM\system::getSystemDBInfo()); - $res = $con->query("SELECT class FROM system.sys_log GROUP BY class ORDER BY class;"); + if(\SYSTEM\system::isSystemDbInfoPG()){ + $res = $con->query("SELECT class FROM system.sys_log GROUP BY class ORDER BY class;"); + }else{ + $res = $con->query("SELECT class FROM system_log GROUP BY class ORDER BY class;"); + } $result = ""; $i = 1; @@ -122,9 +163,10 @@ class saimod_sys_log extends \SYSTEM\SAI\SaiModule { return $result; } - public static function sai_mod__SYSTEM_SAI_saimod_sys_log(){ + public static function sai_mod__SYSTEM_SAI_saimod_sys_log(){ $vars = array(); $vars['error_filter'] = self::generate_error_filters(); + $vars['PICPATH'] = \SYSTEM\WEBPATH(new \SYSTEM\PSAI(), 'modules/saimod_sys_log/img/'); return \SYSTEM\PAGE\replace::replaceFile(\SYSTEM\SERVERPATH(new \SYSTEM\PSAI(),'modules/saimod_sys_log/saimod_sys_log.tpl'), $vars); } diff --git a/sai/modules/saimod_sys_log/saimod_sys_log.tpl b/sai/modules/saimod_sys_log/saimod_sys_log.tpl index 74ed5fd..b697f15 100644 --- a/sai/modules/saimod_sys_log/saimod_sys_log.tpl +++ b/sai/modules/saimod_sys_log/saimod_sys_log.tpl @@ -14,7 +14,7 @@ - +
${error_filter}