Discuz!运行日志记录函数runlog详解
在discuz!的datalog目录下,我们会看到很多格式如YYYYMM_XX.php的文件(如下图所示),打开文件我们就会看到很多操作日志,这些日志怎么生成的呢,今天我们就来看看Discuz!运行日志记录runlog函数
runlog函数定义文件 sourcefunctionfunction_core.php
function runlog($file, $message, $halt=0) { helper_log::runlog($file, $message, $halt); }
我们看到这个函数是调用的helper_log小助手,helper_log定义于:sourceclasshelperhelper_log.php
相关方法如下public static function runlog($file, $message, $halt=0) { global $_G; $nowurl = $_SERVER["REQUEST_URI"]?$_SERVER["REQUEST_URI"]:($_SERVER["PHP_SELF"]?$_SERVER["PHP_SELF"]:$_SERVER["SCRIPT_NAME"]); $log = dgmdate($_G["timestamp"], "Y-m-d H:i:s")." ".$_G["clientip"]." $_G[uid] {$nowurl} ".str_replace(array(" ", " "), array(" ", " "), trim($message))." "; helper_log::writelog($file, $log);//写入文件 if($halt) { exit(); } } public static function writelog($file, $log) { global $_G; $yearmonth = dgmdate(TIMESTAMP, "Ym", $_G["setting"]["timeoffset"]); $logdir = DISCUZ_ROOT."./data/log/"; $logfile = $logdir.$yearmonth."_".$file.".php";//日志文件 if(@filesize($logfile) > 2048000) { $dir = opendir($logdir); $length = strlen($file); $maxid = $id = 0; while($entry = readdir($dir)) { if(strpos($entry, $yearmonth."_".$file) !== false) { $id = intval(substr($entry, $length + 8, -4)); $id > $maxid && $maxid = $id; } } closedir($dir); $logfilebak = $logdir.$yearmonth."_".$file."_".($maxid + 1).".php"; @rename($logfile, $logfilebak); } if($fp = @fopen($logfile, "a")) { @flock($fp, 2); if(!is_array($log)) { $log = array($log); } foreach($log as $tmp) { fwrite($fp, "<?PHP exit;?> ".str_replace(array("<?", "?>"), "", $tmp)." "); } fclose($fp); } }我看可以看到运行日志按月存储在各个分类(日志的分类大致有"illegal", "rate", "credit", "mods", "medal", "ban", "cp", "magic", "error", "invite", "payment", "warn", "crime", "sendmail"几种)的文件下,每条记录的不同字段以制表符 分隔;
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。