PHPローリングログライブラリ
PHP のログを記録する方法として、年と月ごとにフォルダーを分割し、日ごとにファイルを分割する方法を見つけました。この方法には利点と欠点があり、その使用シナリオについて説明します。今日は別のロギング方法です。ファイルローリング方式はログを記録します。もちろん、このローリングメカニズムは以前のロギング方式に追加することもできます。
ログをスクロールさせる方法
ローリング ログは、名前が示すように、一連のログ ファイルを使用してモジュールのログを記録します。同じモジュール内のファイル数は maxNum までに制限され、サイズも maxSize バイトまでに制限されます。ファイル名には、testlog .log、testlog_1.log、testlog_2.log、、、、、などの特定の命名方法があり、testlog.log は、testlog.log ファイルのサイズに達したときの使用中のログ ファイルです。 maxSize を制限すると、以下に示すように、ログ ファイルは逆方向にロールされます:
コードは次のとおりです:
ログ ファイルの数が制限 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 |
最終クラスのログ{ プライベート $レベル; プライベート $maxFileNum; プライベート $maxFileSize; プライベート $logPath; プライベート $ファイル;
//日志の级别DEBUG、MSG、ERR const LOGS_DEBUG = 0; const LOGS_MSG = 1; const LOGS_ERR = 2;
プライベート静的 $instance = null;
プライベート関数 __construct(){}
パブリック静的関数 getInstance() { if(self::$instance == null) { self::$instance = 新しい self(); } self::$instance を返す; }
/** * @Desc 初期化 * @Param $level int レコードレベル * @Param $maxNum int ログファイルの最大数 * @Param $maxSize int 最大ログファイルサイズ * @Param $logPath 文字列ログファイルの保存パス * @Param $file 文字列ログファイル名のプレフィックス * @Return boolean */ パブリック関数 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 )) { false を返す; } $this->level = $level; $this->maxFileNum = $maxNum; $this->maxFileSize = $maxSize; $this->logPath = $logPath; $this->file = $file; true を返す; }
/** * @Desc フォーマットされた時刻文字列を取得します */ パブリック関数 formatTime() { $ustime = 爆発 ( " ", microtime () ); 「[」を返します。 date('Y-m-d H:i:s', time()) ."."。 ($ustime[0] * 1000) 。 "]"; }
/** * @Desc ローリングモードでログファイルを記録します */ 公開関数ログ($str) { $path = $this->logPath.DIRECTORY_SEPARATOR.$this->file.".log"; clearstatcache(); if(file_exists($path)) { if(ファイルサイズ($path) >= $this->maxFileSize) { $インデックス = 1; //获取最大的滚動日志数目 for(;$index { if(!file_exists($this->logPath.DIRECTORY_SEPARATOR.$this->file."_".$index.".log")) { 休憩; } } //已经存在maxFileNum个日志文件了 if($index == $this->maxFileNum) { $インデックス--; } //滚アニメーション日志 for(;$index > 1; $index--) { $new = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_".$index.".log"; $old = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_".($index - 1).".log"; 名前を変更($old, $new); }
$newFile = $this->logPath.DIRECTORY_SEPARATOR.$this->file."_1.log"; 名前変更($path, $newFile); } } $fp = fopen($path, "a+b"); fwrite($fp, $str, strlen($str)); fclose($fp); true を返す; }
/** * @Desc はデバッグ情報を記録します * @Param文字列のログ情報 * @Param string ログが配置されるファイル * @Param string ログが配置されている行 */ パブリック関数デバッグ($msg、$file、$line) { if($this->レベル <= self::LOGS_DEBUG) { $this->log($this->formatTime()."[{$file}:{$line}]DEBUG: ${msg}n"); } }
/** * @Descレコード情報 * @Param文字列のログ情報 * @Param string ログが配置されるファイル * @Param string ログが配置されている行 */ パブリック関数 msg($msg, $file, $line) { if($this->レベル<= self::LOGS_MSG) { $this->log($this->formatTime()."[{$file}:{$line}]MSG: ${msg}n"); } }
/** * @Desc ログエラーメッセージ * @Param文字列のログ情報 * @Param string ログが配置されるファイル * @Param string ログが配置されている行 */ パブリック関数エラー($msg, $file, $line) { if($this->レベル<= self::LOGS_ERR) { $this->log($this->formatTime()."[{$file}:{$line}]ERR: ${msg}n"); } } } |
例を見る
#例中の設置记录级别はmsg(今回はデバッグ情報はありません)、日志文件数は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 #最新の日志はこの文中にあります |