PHP编程:PHP滚动日志的代码实现
《PHP滚动日志的代码实现》要点: PHP滚动日志类库PHP实战 PHP记录日志,我之前接触过的有依照年月分文件夹,然后依照日分文件的日志记录方式,这种方式有利有弊,有他的使用场景,我今天要说的是另一种日志记录方式――文件滚动方式记录日志,当然了,这种滚动机制也可以加在前面那种日志记录方式中.PHP实战 如何让日志滚动起来PHP实战 滚动日志,顾名思义,记录一个模块的日志用一系列的日志文件,同一模块文件个数有限制,最多maxNum个,大小也有限制,最大maxSize字节,文件名有一定的命名方式,好比:testlog.log、testlog_1.log,testlog_2.log、、、、、、其中testlog.log是正在使用的日志文件,当testlog.log文件大小到达限制maxSize的时候就会向后滚动日志文件,就像下面这样:PHP实战
代码如下:
testlog_2.log ?-> testlog_3.log testlog_1.log ?-> testlog_2.log testlog.log ?-> testlog_1.log testlog.log #0kb 当日志文件个数到达限制maxNum的时候就会启动淘汰机制,删除最老的日志,好比说maxNum设置为10,这个时候算上testlog.log一共最多有10个文件,当滚动的时候如果存在testlog_9.log就会从testlog_8.log开始滚动,覆盖掉testlog_9.log,这样就可以保证日志正常记录,而且不会出现很大很大的日志文件,保证日志系统的正常运行.PHP实战 代码实现 <?php final class LOGS { private $level; private $maxFileNum; private $maxFileSize; private $logPath; private $file; //日志的级别DEBUG,MSG,ERR const LOGS_DEBUG = 0; const LOGS_MSG = 1; const LOGS_ERR = 2; private static $instance = null; private function __construct(){} public static function getInstance() { if(self::$instance == null) { self::$instance = new self(); } return self::$instance; } /** * @Desc 初始化 * @Param $level int 记录级别 * @Param $maxNum int 最大日志文件数目 * @Param $maxSize int 最大日志文件大小 * @Param $logPath string 日志文件保留路径 * @Param $file string 日志文件名称前缀 * @Return boolean */ public function init($level,$maxNum,$maxSize,$logPath,$file) { $level = intval($level); $maxNum = intval($maxNum); $maxSize = intval($maxSize); !is_dir($logPath) && mkdir($logPath,0777,true); if(!in_array($level,array(self::LOGS_DEBUG,self::LOGS_MSG,self::LOGS_ERR)) || $maxNum <= 0 || $maxSize <= 0 || !is_dir($logPath)) { return false; } $this->level = $level; $this->maxFileNum = $maxNum; $this->maxFileSize = $maxSize; $this->logPath = $logPath; $this->file = $file; return true; } /** * @Desc 获取格式化时间串 */ public function formatTime() { $ustime = explode ( " ",microtime () ); return "[" . date('Y-m-d H:i:s',time()) .".". ($ustime[0] * 1000) . "]"; } /** * @Desc 滚动方式记录日志文件 */ public function log($str) { $path = $this->logPath.DIRECTORY_SEPARATOR.$this->file.".log"; clearstatcache(); if(file_exists($path)) { if(filesize($path) >= $this->maxFileSize) { $index = 1; //获取最大的滚动日志数目 for(;$index < $this->maxFileNum; $index++) { if(!file_exists($this->logPath.DIRECTORY_SEPARATOR.$this->file."_".$index.".log")) { break; } } //已经存在maxFileNum个日志文件了 if($index == $this->maxFileNum) { $index--; } //滚动日志 for(;$index > 1; $index--) { $new = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_".$index.".log"; $old = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_".($index - 1).".log"; rename($old,$new); } $newFile = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_1.log"; rename($path,$newFile); } } $fp = fopen($path,"a+b"); fwrite($fp,$str,strlen($str)); fclose($fp); return true; } /** * @Desc 记录调试信息 * @Param string 日志信息 * @Param string 日志所在文件 * @Param string 日志所在行 */ public function debug($msg,$file,$line) { if($this->level <= self::LOGS_DEBUG) { $this->log($this->formatTime()."[{$file}:{$line}]DEBUG: ${msg}n"); } } /** * @Desc 记录信息 * @Param string 日志信息 * @Param string 日志所在文件 * @Param string 日志所在行 */ public function msg($msg,$line) { if($this->level <= self::LOGS_MSG) { $this->log($this->formatTime()."[{$file}:{$line}]MSG: ${msg}n"); } } /** * @Desc 记录错误信息 * @Param string 日志信息 * @Param string 日志所在文件 * @Param string 日志所在行 */ public function err($msg,$line) { if($this->level <= self::LOGS_ERR) { $this->log($this->formatTime()."[{$file}:{$line}]ERR: ${msg}n"); } } } 看个例子 #例子中设置记录级别为msg(此时debug信息是不会纪录的),日志文件个数为5,大小为200个字节(测试便利),文件名称为testlog $logs = LOGS::getInstance(); $logs->init(1,5,200,"./",'testlog'); $logs->msg("YRT",__FILE__,__LINE__); $logs->debug("YRT",__LINE__); 当我们不停的运行这个例子的时候,会在代码所在文件夹下生成5个文件就像下面这样: testlog_4.log testlog_3.log testlog_2.log testlog_1.log testlog.log #最新的日志在这个文件中 以上所述便是本文的全部内容了,希望大家能够喜欢.PHP实战 欢迎参与《PHP滚动日志的代码实现》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |