zoukankan      html  css  js  c++  java
  • PHP记录和读取JSON格式日志文件

    我们有时需要记录用户或者后端的某个操作事件的运行情况,可以使用后端语言如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

  • 相关阅读:
    【JavaScript进阶】深入理解JavaScript中ES6的Promise的作用并实现一个自己的Promise
    【原创】使用HTML5+canvas+JavaScript开发的原生中国象棋游戏及源码分享
    【VIP视频网站项目三】项目框架搭建、项目路由配置、数据库表结构设计
    【JavaScript】通过封装自己的JSONP解决浏览器的跨域问题(Ajax跨域)
    【VIP视频网站项目二】搭建爱奇艺优酷腾讯视频官网首页轮播图效果及实现原理分析
    【VIP视频网站项目一】搭建视频网站的前台页面(导航栏+轮播图+电影列表+底部友情链接)
    【JavaScript】不使用正则表达式和字符串的方式来解析浏览器的URl地址信息
    【JavaScript游戏开发】JavaScript+HTML5封装的苏拉卡尔塔游戏(包含源码)
    【JavaScript游戏开发】使用HTML5+Canvas+JavaScript 封装的一个超级马里奥游戏(包含源码)
    【JavaScript游戏开发】使用HTML5 canvas开发的网页版中国象棋项目
  • 原文地址:https://www.cnblogs.com/haohaoyuan/p/7920564.html
Copyright © 2011-2022 走看看