PHP滾動日誌

2022-03-09 11:50:53 字數 2902 閱讀 8420

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,這樣就可以保證日誌正常記錄,而且不會出現很大很大的日誌檔案,保證日誌系統的正常執行。

**實現

<?php

final class logs

public static function getinstance()

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)

$this->level = $level;

$this->maxfilenum = $maxnum;

$this->maxfilesize = $maxsize;

$this->logpath = $logpath;

$this->file = $file;

return true;

} /**

* @desc 獲取格式化時間串

*/public function formattime()

/**

* @desc 滾動方式記錄日誌檔案

*/public function log($str)

}//已經存在maxfilenum個日誌檔案了

if($index == $this->maxfilenum)

//滾動日誌

for(;$index > 1; $index--)

$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)

:]debug: $\n");

} }/**

* @desc 記錄資訊

* @param string 日誌資訊

* @param string 日誌所在檔案

* @param string 日誌所在行

*/public function msg($msg, $file, $line)

:]msg: $\n");

} }/**

* @desc 記錄錯誤資訊

* @param string 日誌資訊

* @param string 日誌所在檔案

* @param string 日誌所在行

*/public function err($msg, $file, $line)

:]err: $\n");

} }}

看個例子
#例子中設定記錄級別為msg(此時debug資訊是不會紀錄的),日誌檔案個數為5,大小為200個位元組(測試方便),檔名稱為testlog

$logs = logs::getinstance();

$logs->init(1, 5, 200, "./", 'testlog');

$logs->msg("yrt", __file__, __line__);

$logs->debug("yrt", __file__, __line__);

當我們不停的執行這個例子的時候,會在**所在資料夾下生成5個檔案就像下面這樣:

testlog_4.log

testlog_3.log

testlog_2.log

testlog_1.log

testlog.log #最新的日誌在這個檔案中

apache 配置成滾動日誌

apache預設的日誌只是1個檔案,隨著訪問量的加大,該日誌檔案會越來越大,借助apache的rotatelogs.exe自動生成滾動日誌。下面配置配置成每24小時產生1個新的日誌檔案 先搭建1個很簡單 進行訪問 documentroot e apachetestweb allowoverride ...

Apache日誌滾動和過濾

終於是可以讓apache不產生超大的日誌了。原文 customlog logs access.log combined 改為setenvif request uri js css gif jpg png swf ico dontlog setenvif request uri html htm do...

Nginx日誌滾動指令碼

nginx日誌滾動可分為3步 將access.log重新命名成形如access 202006161113.log 通過kill命令向nginx的程序傳送 usr1訊號,通知nginx重新建立access.log檔案 刪除修改時間比指定時間更早的歷史日誌 示例指令碼 bin bash rename a...