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 相关文章推荐
用Socket发送电子邮件(利用需要验证的SMTP服务器)
Oct 09 PHP
深入了解php4(1)--回到未来
Oct 09 PHP
THINKPHP+JS实现缩放图片式截图的实现
Mar 07 PHP
PHP 命名空间实例说明
Jan 27 PHP
PHP 第二节 数据类型之数组
Apr 28 PHP
web server使用php生成web页面的三种方法总结
Oct 28 PHP
浅谈php和.net的区别
Sep 28 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
Mar 07 PHP
linux下php上传文件注意事项
Jun 11 PHP
php str_replace替换指定次数的方法详解
May 05 PHP
Yii框架的路由配置方法分析
Sep 09 PHP
用php如何解决大文件分片上传问题
Jul 07 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学习 运算符与运算符优先级
2008/06/15 PHP
Thinkphp中的volist标签用法简介
2014/06/18 PHP
php中实现可以返回多个值的函数实例
2015/03/21 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
Javascript &amp; DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
简单易懂的天气插件(代码分享)
2017/02/04 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
python实现二维插值的三维显示
2018/12/17 Python
Python爬虫小例子——爬取51job发布的工作职位
2020/07/10 Python
css3 边框、背景、文本效果的实现代码
2018/03/21 HTML / CSS
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
免税水晶:Duty Free Crystal
2019/05/13 全球购物
FILA德国官方网站:来自意大利的体育和街头服饰品牌
2019/07/19 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
Weblogic的布署方式
2013/08/23 面试题
餐饮服务员岗位职责
2015/02/09 职场文书
同事欢送会致辞
2015/07/31 职场文书
生活小常识广播稿
2015/08/19 职场文书
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers