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 相关文章推荐
PHP模拟SQL Server的两个日期处理函数
Oct 09 PHP
PHP+DBM的同学录程序(3)
Oct 09 PHP
用ODBC的分页显示
Oct 09 PHP
php中用memcached实现页面防刷新功能
Aug 19 PHP
php中获取主机名、协议及IP地址的方法
Nov 18 PHP
php将字符串转换成16进制的方法
Mar 17 PHP
php动态变量定义及使用
Jun 10 PHP
解决PHP里大量数据循环时内存耗尽的方法
Oct 10 PHP
详解PHP安装mysql.so扩展的方法
Dec 31 PHP
ThinkPHP中调用PHPExcel的实现代码
Apr 08 PHP
php微信开发之关键词回复功能
Jun 13 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
Oct 28 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_multisort与uasort的区别
2011/03/24 PHP
php中实现记住密码下次自动登录的例子
2014/11/06 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
javascript实现checkbox全选的代码
2015/04/30 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
JSON 必知必会 观后记
2016/10/27 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
Python操作json数据的一个简单例子
2014/04/17 Python
Python中强大的命令行库click入门教程
2016/12/26 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
2018/08/03 Python
django url到views参数传递的实例
2019/07/19 Python
使用python实现kNN分类算法
2019/10/16 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
匡威帆布鞋美国官网:Converse美国
2016/08/22 全球购物
TheFork葡萄牙:欧洲领先的在线餐厅预订平台
2019/05/27 全球购物
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
幼儿园美术教学反思
2014/01/31 职场文书
2014年学生工作总结
2014/11/20 职场文书
2014年优秀党员材料
2014/12/18 职场文书
初中团支书竞选稿
2015/11/21 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
深入理解Vue的数据响应式
2021/05/15 Vue.js
Python提取PDF指定内容并生成新文件
2021/06/09 Python