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个人网站架设连环讲(四)
Oct 09 PHP
php class中public,private,protected的区别以及实例分析
Jun 18 PHP
php实现的获取网站备案信息查询代码(360)
Sep 23 PHP
关于JSON以及JSON在PHP中的应用技巧
Nov 27 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
Jun 12 PHP
PHP 5.3新增魔术方法__invoke概述
Jul 23 PHP
Yii入门教程之目录结构、入口文件及路由设置
Nov 25 PHP
PHP获取input输入框中的值去数据库比较显示出来
Nov 16 PHP
php显示页码分页类的封装
Jun 08 PHP
PHP实现动态压缩js与css文件的方法
May 02 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
May 06 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
Aug 24 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
PHP 在线翻译函数代码
2009/05/07 PHP
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
2012/08/31 PHP
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
php微信开发自定义菜单
2016/08/27 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
学习ExtJS table布局
2009/10/08 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
AngularJS 模块详解及简单实例
2016/07/28 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
node实现基于token的身份验证
2018/04/09 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
vue实现可视化可拖放的自定义表单的示例代码
2019/03/20 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
JavaScript判断数据类型有几种方法及区别介绍
2020/09/02 Javascript
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[43:36]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
Django项目使用ckeditor详解(不使用admin)
2019/12/17 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
python多线程和多进程关系详解
2020/12/14 Python
三个儿子教学反思
2014/02/03 职场文书
入股协议书范本
2014/04/14 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
考研英语辞职信
2015/05/13 职场文书
体育委员竞选稿
2015/11/21 职场文书
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python