程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP滾動日志的代碼實現

PHP滾動日志的代碼實現

編輯:關於PHP編程

     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一共最多有10個文件,當滾動的時候如果存在testlog_9.log就會從testlog_8.log開始滾動,覆蓋掉testlog_9.log,這樣就可以保證日志正常記錄,而且不會出現很大很大的日志文件,保證日志系統的正常運行。

    代碼實現

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 <?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, $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

    1 2 3 4 5 $logs = LOGS::getInstance(); $logs->init(1, 5, 200, "./", 'testlog');   $logs->msg("YRT", __FILE__, __LINE__); $logs->debug("YRT", __FILE__, __LINE__);

    當我們不停的運行這個例子的時候,會在代碼所在文件夾下生成5個文件就像下面這樣:

    1 2 3 4 5 testlog_4.log testlog_3.log testlog_2.log testlog_1.log testlog.log #最新的日志在這個文件中
    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved