PHP记录和读取JSON格式日志文件


Posted in PHP onJuly 07, 2016

我们有时需要记录用户或者后端的某个操作事件的运行情况,可以使用后端语言如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.3water.com/201607/yuanma/phplog(3water.com).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
Ajax PHP分页演示
Jan 02 PHP
php动态实现表格跨行跨列实现代码
Nov 06 PHP
PHPEXCEL 使用小记
Jan 06 PHP
PHP编程函数安全篇
Jan 08 PHP
php版小黄鸡simsimi聊天机器人接口分享
Jan 26 PHP
页面利用渐进式JPEG来提升用户体验度
Dec 01 PHP
php支付宝手机网页支付类实例
Mar 04 PHP
Java中final关键字详解
Aug 10 PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
Mar 22 PHP
laravel 5.3 单用户登录简单实现方法
Oct 14 PHP
php中pcntl_fork详解
Apr 01 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
Jul 07 #PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
Jul 07 #PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
Jul 06 #PHP
PHP判断JSON对象是否存在的方法(推荐)
Jul 06 #PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
Jul 06 #PHP
Yii2 RESTful中api的使用及开发实例详解
Jul 06 #PHP
PHP单链表的实现代码
Jul 05 #PHP
You might like
php array_map()数组函数使用说明
2011/07/12 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
js location.replace与location.reload的区别
2010/09/08 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
2013/07/30 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
javascript简单性能问题及学习笔记
2014/02/04 Javascript
用js编写的简单的计算器代码程序
2015/08/04 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
原生JS+HTML5实现的可调节写字板功能示例
2018/08/30 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
layer弹出层取消遮罩的方法
2019/09/25 Javascript
[07:27]DOTA2卡尔工作室 英雄介绍水晶室女篇
2013/06/21 DOTA
Python面向对象类的继承实例详解
2018/06/27 Python
Python实现的北京积分落户数据分析示例
2020/03/27 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
Python能做什么
2020/06/02 Python
python属于解释型语言么
2020/06/15 Python
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
爱情保证书范文
2014/02/01 职场文书
《三袋麦子》教学反思
2014/03/02 职场文书
教师自我鉴定范文
2014/03/20 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
影子教师研修方案
2014/06/14 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
乱世佳人观后感
2015/06/08 职场文书
《法国号》教学反思
2016/02/22 职场文书
世界文化遗产导游词
2019/08/07 职场文书