找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3561|回复: 0

[分享] Discuz!运行日志记录函数runlog详解

[复制链接]
发表于 2017-11-15 13:37:44 | 显示全部楼层 |阅读模式 来自 河南省新乡市
在discuz!的\data\log\目录下,我们会看到很多格式如YYYYMM_XX.php的文件(如下图所示),打开文件我们就会看到很多操作日志,这些日志怎么生成的呢,今天我们就来看看Discuz!运行日志记录runlog函数
20170401133129184.jpg
runlog函数定义文件 \source\function\function_core.php
  1. function runlog($file, $message, $halt=0) {  
  2.     helper_log::runlog($file, $message, $halt);  
  3. }  
复制代码


我们看到这个函数是调用的helper_log小助手,helper_log定义于:\source\class\helper\helper_log.php
相关方法如下
  1. public static function runlog($file, $message, $halt=0) {  
  2.     global $_G;  
  3.     $nowurl = $_SERVER['REQUEST_URI']?$_SERVER['REQUEST_URI']:($_SERVER['PHP_SELF']?$_SERVER['PHP_SELF']:$_SERVER['SCRIPT_NAME']);  
  4.     $log = dgmdate($_G['times**p'], 'Y-m-d H:i:s')."\t".$_G['clientip']."\t$_G[uid]\t{$nowurl}\t".str_replace(array("\r", "\n"), array(' ', ' '), trim($message))."\n";  
  5.     helper_log::writelog($file, $log);//写入文件  
  6.     if($halt) {  
  7.         exit();  
  8.     }  
  9. }  
  10.   
  11. public static function writelog($file, $log) {  
  12.     global $_G;  
  13.     $yearmonth = dgmdate(TIMES**P, 'Ym', $_G['setting']['timeoffset']);  
  14.     $logdir = DISCUZ_ROOT.'./data/log/';  
  15.     $logfile = $logdir.$yearmonth.'_'.$file.'.php';//日志文件  
  16.     if(@filesize($logfile) > 2048000) {  
  17.         $dir = opendir($logdir);  
  18.         $length = strlen($file);  
  19.         $maxid = $id = 0;  
  20.         while($entry = readdir($dir)) {  
  21.             if(strpos($entry, $yearmonth.'_'.$file) !== false) {  
  22.                 $id = intval(substr($entry, $length + 8, -4));  
  23.                 $id > $maxid && $maxid = $id;  
  24.             }  
  25.         }  
  26.         closedir($dir);  
  27.   
  28.   
  29.         $logfilebak = $logdir.$yearmonth.'_'.$file.'_'.($maxid + 1).'.php';  
  30.         @rename($logfile, $logfilebak);  
  31.     }  
  32.     if($fp = @fopen($logfile, 'a')) {  
  33.         @flock($fp, 2);  
  34.         if(!is_array($log)) {  
  35.             $log = array($log);  
  36.         }  
  37.         foreach($log as $tmp) {  
  38.             fwrite($fp, "<?PHP exit;?>\t".str_replace(array('<?', '?>'), '', $tmp)."\n");  
  39.         }  
  40.         fclose($fp);  
  41.     }  
  42. }  
复制代码



我看可以看到运行日志按月存储在各个分类(日志的分类大致有'illegal', 'rate', 'credit', 'mods', 'medal', 'ban', 'cp', 'magic', 'error', 'invite', 'payment', 'warn', 'crime', 'sendmail'几种)的文件下,每条记录的不同字段以制表符\t分隔;

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-4-25 17:22 , Processed in 0.039716 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表