Heim > Artikel > Backend-Entwicklung > PHP-Rollprotokoll
PHP-Rolling-Log-Bibliothek
PHP zeichnet Protokolle auf. Ich habe die Protokollierungsmethode kennengelernt, bei der Ordner nach Jahr und Monat unterteilt werden und die Dateien dann nach Tag unterteilt werden. Diese Methode hat Vor- und Nachteile und worüber ich sprechen möchte Heute gibt es eine andere Möglichkeit, Protokolle aufzuzeichnen: Dieser Rollmechanismus kann natürlich auch zur vorherigen Protokollierungsmethode hinzugefügt werden.
Rolling Log verwendet, wie der Name schon sagt, eine Reihe von Protokolldateien, um das Protokoll eines Moduls aufzuzeichnen. Die Anzahl der Dateien im selben Modul ist auf maxNum begrenzt, und die Größe ist ebenfalls auf maxSize begrenzt Bytes. Der Dateiname hat eine bestimmte Benennungsmethode, wie zum Beispiel: testlog.log, testlog_1.log, testlog_2.log, wobei testlog.log die verwendete Protokolldatei ist, wenn die Dateigröße testlog.log erreicht ist Wenn die maximale Größe begrenzt ist, wird die Protokolldatei wie folgt rückwärts gerollt:
<code>testlog_2.log -> testlog_3.log testlog_1.log -> testlog_2.log testlog.log -> testlog_1.log testlog.log #0kb</code>
Wenn die Anzahl der Protokolldateien den Grenzwert maxNum erreicht, wird der Eliminierungsmechanismus gestartet und das älteste Protokoll gelöscht. Wenn maxNum beispielsweise auf 10 eingestellt ist, gibt es maximal 10 Dateien einschließlich testlog.log Wenn testlog_9.log zu diesem Zeitpunkt vorhanden ist, beginnt es mit testlog_8.log und überschreibt testlog_9.log. Dadurch wird eine normale Protokollaufzeichnung sichergestellt und es werden keine sehr großen Protokolldateien angezeigt, wodurch der normale Betrieb des Protokollsystems sichergestellt wird.
<code><?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"); } } }</code>
<code>#例子中设置记录级别为msg(此时debug信息是不会纪录的),日志文件个数为5,大小为200个字节(测试方便),文件名称为testlog $logs = LOGS::getInstance(); $logs->init(1, 5, 200, "./", 'testlog'); $logs->msg("YRT", __FILE__, __LINE__); $logs->debug("YRT", __FILE__, __LINE__);</code>
Wenn wir dieses Beispiel kontinuierlich ausführen, werden in dem Ordner, in dem sich der Code befindet, 5 Dateien generiert, wie die folgenden:
<code>testlog_4.log testlog_3.log testlog_2.log testlog_1.log testlog.log #最新的日志在这个文件中</code>
Das Obige stellt das PHP-Rolling-Log vor, einschließlich einiger Aspekte des Inhalts. Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.