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 相关文章推荐
967 个函式
Oct 09 PHP
PHP模拟SQL Server的两个日期处理函数
Oct 09 PHP
新闻分类录入、显示系统
Oct 09 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
Oct 17 PHP
php上传文件中文文件名乱码的解决方法
Nov 01 PHP
PHP实现自动登入google play下载app report的方法
Sep 23 PHP
PHP常用技术文之文件操作和目录操作总结
Sep 27 PHP
php函数连续调用实例分析
Jul 30 PHP
PHP中header函数的用法及其注意事项详解
Jun 13 PHP
Yii2下点击验证码的切换实例代码
Mar 14 PHP
php实现的统计字数函数定义与使用示例
Jul 26 PHP
PHP7 标准库修改
Mar 09 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中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
javascript事件处理模型实例说明
2016/05/31 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
2018/03/07 Javascript
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
Python 文件处理注意事项总结
2017/04/10 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
python代码编写计算器小程序
2020/03/30 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
Python class的继承方法代码实例
2020/02/14 Python
Python tempfile模块生成临时文件和临时目录
2020/09/30 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
班级出游活动计划书
2014/08/15 职场文书
七一讲话心得体会
2014/09/05 职场文书
感恩的心主题班会
2015/08/12 职场文书
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle
javascript实现计算器功能详解流程
2021/11/01 Javascript