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"几种)的文件下,每条记录的不同字段以制表符 分隔;
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
