當前位置:首頁 > PHP教程 > php應用 > 列表

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

發布:smiling 來源: PHP粉絲網  添加日期:2018-09-16 12:34:01 瀏覽: 評論:0 

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

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

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

PHP寫日志文件

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

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

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

  1. function writeLog($filename,$msg){ 
  2.     $res = array(); 
  3.     $res['msg'] = $msg
  4.     $res['logtime'] = date("Y-m-d H:i:s",time()); 
  5.  
  6.     //如果日志文件超過了指定大小則備份日志文件 
  7.     if(file_exists($filename) && (abs(filesize($filename)) > 1024000)){ 
  8.         $newfilename = dirname($filename).'/'.time().'-'.basename($filename); 
  9.         rename($filename$newfilename); 
  10.     } 
  11.  
  12.     //如果是新建的日志文件,去掉內容中的第一個字符逗號 
  13.     if(file_exists($filename) && abs(filesize($filename))>0){ 
  14.         $content = ",".json_encode($res); 
  15.     }else
  16.         $content = json_encode($res); 
  17.     } //phpfensi.com 
  18.  
  19.     //往日志文件內容后面追加日志內容 
  20.     file_put_contents($filename$content, FILE_APPEND); 

PHP讀日志文件

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

  1. function readLog($filename){ 
  2.     if(file_exists($filename)){ 
  3.         $content = file_get_contents($filename); 
  4.         $json = json_decode('['.$content.']',true); 
  5.     }else
  6.         $json = '{"msg":"The file does not exist."}'
  7.     } 
  8.     return $json

日志寫入和讀取類

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

  1. <?php  
  2. /* 
  3.  * 日志類 
  4.  * 每天生成一個日志文件,當文件超過指定大小則備份日志文件并重新生成新的日志文件 
  5. */ 
  6. class Log { 
  7.   
  8.     private $maxsize = 1024000; //最大文件大小1M 
  9.      
  10.     //寫入日志 
  11.     public function writeLog($filename,$msg){ 
  12.         $res = array(); 
  13.         $res['msg'] = $msg
  14.         $res['logtime'] = date("Y-m-d H:i:s",time()); 
  15.   
  16.         //如果日志文件超過了指定大小則備份日志文件 
  17.         if(file_exists($filename) && (abs(filesize($filename)) > $this->maxsize)){ 
  18.             $newfilename = dirname($filename).'/'.time().'-'.basename($filename); 
  19.             rename($filename$newfilename); 
  20.         } 
  21.   
  22.         //如果是新建的日志文件,去掉內容中的第一個字符逗號 
  23.         if(file_exists($filename) && abs(filesize($filename))>0){ 
  24.             $content = ",".json_encode($res); 
  25.         }else
  26.             $content = json_encode($res); 
  27.         } 
  28.   
  29.         //往日志文件內容后面追加日志內容 
  30.         file_put_contents($filename$content, FILE_APPEND); 
  31.     } 
  32.   
  33.   
  34.     //讀取日志 
  35.     public function readLog($filename){ 
  36.         if(file_exists($filename)){ 
  37.             $content = file_get_contents($filename); 
  38.             $json = json_decode('['.$content.']',true); 
  39.         }else
  40.             $json = '{"msg":"The file does not exist."}'
  41.         } 
  42.         return $json
  43.     } 
  44.  ?> 

使用方法:

  1. $filename = "logs/log_".date("Ymd",time()).".txt"
  2. $msg = '寫入了日志'
  3. $Log = new Log(); //實例化 
  4. $Log->writeLog($filename,$msg); //寫入日志 
  5. $loglist = $Log->readLog($filename); //讀取日志

Tags: 格式 文件 日志

分享到:

天气网首页彩吧