接下来遵照日分文件的日志记录方式

PHP滚动日志类库

PHP记录日志,小编此前接触过的有根据年月分文件夹,然后根据日分文件的日记记录情势,这种格局有利有弊,有她的使用意况,笔者今日要说的是另意气风发种日志记录情势——文件滚动方式记录日志,当然了,这种滚动机制也能够加在前面这种日志记录方式中。

如何让日志滚动起来

滚动日志,看名就能够猜到其意义,记录一个模块的日记用生龙活虎连串的日记文件,同一模块文件个数有节制,最多maxNum个,大小也会有节制,最大maxSize字节,文件名有自然的命名格局,比方:testlog.log、testlog_1.log,testlog_2.log、、、、、、在那之中testlog.log是正在利用的日志文件,当testlog.log文件大小达到约束maxSize的时候就能够向后滚动日志文件,有如上边那样:

复制代码 代码如下:
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蓬蓬勃勃共最多有十二个文本,当滚动的时候要是存在testlog_9.log就会从testlog_8.log开班滚动,覆盖掉testlog_9.log,那样就能够保险日志符合规律记录,何况不会鬼使神差不小超大的日记文件,保障日志系统的正规运作。

代码达成

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, $file, $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, $file, $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", apizl_file, apizl_line);
$logs->debug("YRT", apizl_file, apizl_line);

当大家不停的运作那个例子的时候,会在代码所在文件夹下生成5个文件就像下边那样:

testlog_4.log
testlog_3.log
testlog_2.log
testlog_1.log
testlog.log  #最新的日志在这个文件中

以上所述就是本文的全体内容了,希望大家能够合意。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website