contents 日誌文件 轉換 ret abs 轉換成 情況 查找 $max

我們有時需要記錄用戶或者後端的某個操作事件的運行情況,可以使用後端語言如PHP將操作結果記錄到日誌文件中,方便測試和查找問題。尤其是這些在後端運行的而前端不能直接看到運行結果的,那麽就可以用日誌文件記錄下來,如果你經常跟一些接口開發如支付寶接口、微信卡券接口打交道的話,日誌記錄就必不可少了。

我們講的PHP記錄日誌,就是將日誌信息寫入到一個日誌文件中,區別於內存日誌。寫入日誌的流程是:打開日誌文件(如果不存在則新創建),然後將日誌內容追加到日誌文件的後面,最後關閉日誌文件。

本文中,我們將日誌內容以json個格式保存,方便必要時直接讀取。

PHP寫日誌文件
PHP寫日誌文件需要打開、寫入和關閉文件等操作,PHP有fopen(),fwrite()和fclose()三個函數與之對應,而另一個函數file_put_contents()它也能字符串寫入文件,其實這個函數實現了依次調用 fopen(),fwrite() 以及 fclose()。所以我們使用file_put_contents()非常簡潔。值得註意的是,往文件後面追加內容時需要帶上參數:FILE_APPEND。

實際運行中,我們有可能會遇到日誌文件超大的情況,所以我們設置一個最大值,當日誌文件大小超過這個最大值時,將此日誌文件備份好,然後重新生成一個新的日誌文件來記錄新的日誌內容。

在寫日誌前,我們將日誌內容進行json格式化,所以需要將內容轉化成JSON格式,然後寫入文件。當然你也可以不用json,或者換作別的工具程序(如日誌分析工具)可以閱讀的格式。總之,我們寫入的內容是方便必要時可以方便讀取。

 function writeLog($filename,$msg){ 
 $res = array(); 
 $res[‘msg‘] = $msg; 
 $res[‘logtime‘] = date("Y-m-d H:i:s",time()); 
 
 //如果日誌文件超過了指定大小則備份日誌文件 
 if(file_exists($filename) && (abs(filesize($filename)) > 1024000)){ 
  $newfilename = dirname($filename).‘/‘.time().‘-‘.basename($filename); 
  rename($filename, $newfilename); 
 } 
 
 //如果是新建的日誌文件,去掉內容中的第一個字符逗號 
 if(file_exists($filename) && abs(filesize($filename))>0){ 
  $content = ",".json_encode($res); 
 }else{ 
  $content = json_encode($res); 
 } 
 
 //往日誌文件內容後面追加日誌內容 
 file_put_contents($filename, $content, FILE_APPEND); 
 } 

PHP讀日誌文件
必要時,我們會讀取日誌內容進行分析,同樣我們使用PHP的file_get_contents()函數,直接將內容讀取,並且轉換成json格式,方便調用。

 function readLog($filename){ 
 if(file_exists($filename)){ 
  $content = file_get_contents($filename); 
  $json = json_decode(‘[‘.$content.‘]‘,true); 
 }else{ 
  $json = ‘{"msg":"The file does not exist."}‘; 
 } 
 return $json; 
 } 

日誌寫入和讀取類
寫入和讀取日誌的功能我們經常要用到,所以我將寫入和讀取功能整理成類,方便調用。

<?php 
/* 
 * 日誌類 
 * 每天生成一個日誌文件,當文件超過指定大小則備份日誌文件並重新生成新的日誌文件 
*/ 
class Log { 
 
 private $maxsize = 1024000; //最大文件大小1M 
 
 //寫入日誌 
 public function writeLog($filename,$msg){ 
 $res = array(); 
 $res[‘msg‘] = $msg; 
 $res[‘logtime‘] = date("Y-m-d H:i:s",time()); 
 
 //如果日誌文件超過了指定大小則備份日誌文件 
 if(file_exists($filename) && (abs(filesize($filename)) > $this->maxsize)){ 
  $newfilename = dirname($filename).‘/‘.time().‘-‘.basename($filename); 
  rename($filename, $newfilename); 
 } 
 
 //如果是新建的日誌文件,去掉內容中的第一個字符逗號 
 if(file_exists($filename) && abs(filesize($filename))>0){ 
  $content = ",".json_encode($res); 
 }else{ 
  $content = json_encode($res); 
 } 
 
 //往日誌文件內容後面追加日誌內容 
 file_put_contents($filename, $content, FILE_APPEND); 
 } 
 
 
 //讀取日誌 
 public function readLog($filename){ 
 if(file_exists($filename)){ 
  $content = file_get_contents($filename); 
  $json = json_decode(‘[‘.$content.‘]‘,true); 
 }else{ 
  $json = ‘{"msg":"The file does not exist."}‘; 
 } 
 return $json; 
 } 
} 
 ?> 

使用方法:

$filename = "logs/log_".date("Ymd",time()).".txt"; 
$msg = ‘寫入了日誌‘; 
$Log = new Log(); //實例化 
$Log->writeLog($filename,$msg); //寫入日誌 
$loglist = $Log->readLog($filename); //讀取日誌 

源碼下載:http://xiazai.jb51.net/201607/yuanma/phplog(jb51.net).rar

PHP記錄和讀取JSON格式日誌文件