全面解读PHP框架的日志系统

发布时间:2020-03-26 13:47:41

来源:亿速云

阅读:114

作者:小新

今天小编分享的是关于PHP框架的日志系统,可能大家对PHP框架并不陌生,或者从来没有了解过PHP框架。但是不用担心,今天小编会以最简单的描述来讲PHP框架的日志系统的原理。

引言

接触过php框架的朋友们可能都知道,日志在项目中的重要作用了,他可以帮助我们定位错误的位置,让程序更友好(处理得当的话不会直接抛出一大堆只有程序猿才真正动的英文),调试的时候也会很方便,还可以记录一些重要的操作等等,总之一个完整的项目要是没了日志系统,就已经开发的路上布满了荆棘、坑洼,肯定会磕磕绊绊的。

简介

要掌握PHP日志系统,必须先对这几点东西了解透彻。

一、php的几个函数set_exception_handler(callback $exception_handler); //异常捕获自定义处理函数注册

set_error_handler(callback $error_handler); //错误捕获自定义处理函数注册

register_shutdown_function(callback $callback); //程序执行时异常终止错误捕获处理函数注册

这三个函数在错误处理控制中给开发者提供了很大的自主空间,在日志系统中记录日志信息有他们的功劳。

在程序中出现异常(exception)问题时,php内核会抛出异常错误,然后将错误信息打印给使用者,如果注册了exception处理函数,php抛出的异常会转给自定义的注册的异常捕获函数,这个函数里面包含了我们要做的处理,记录错误信息(包括错误详细内容、错误位置),该函数处理完异常后,异常就会终止。

当程序中出现error时,我们注册的error处理函数会在函数中将错误信息转化为一个错误异常对象传递给异常处理函数,也就是第一步的$exception_handler函数。

当成续重出现shutdown错误时,会执行我们注册的异常终止处理函数,该函数通过error_get_last()获取到最后的shutdown时的错误对象,接着和上一部一样,生成一个error exception对象,将该对象传递给我们注册的异常处理函数。

可以看到,其实不管是异常还是错误,都是将自己的信息转化为异常处理函数认识的异常信息,然后交给异常处理函数处理,非异常信息就像化了妆的女人一样,异常处理程序不认识这些非异常信息,只有将装卸掉(非异常信息自己转化为异常信息,准确的说应该是抛出),异常处理才认识。

php日志系统中的错误处理流程

那么现在问题来了,这几个函数一般会配合一个异常处理类库,加上一个错误日志记录类库来进行工作,异常处理类库中包含要注册的3个函数,日志记录类库在$exception_handler中调用,用来合理的记录和放置日志文件的位置,上面说到的几个函数一般是在程序框架入口处进行加载注册的,就像下面这样:

这里面用的是array(class,function)这种方式。set_exception_handler(array("Myexception","exceptionHandler"));

set_error_handler(array("Myexception","errorHandler"));

register_shutdown_function(array("Myexception","shutdownHandler"));

二、日志记录相关类库

第一部分介绍到的东西只是对异常、错误、shutdown进行了捕获,这只是第一步,接下来还要对捕获到的信息进行合理的处理,比如说记录这些日志信息到本地文件系统中(这个操作是在array(“Myexception”,”exceptionHandler”)),这个地方就用到了日志记录类库。(下面要说的类库是借鉴了kohana日志系统的设计)。

日式日志记录也很简单只要做的将信息添加到文件末尾就行,这个很容易实现,相信大家都可以自己实现,但是要设计出一个便捷的、高效的、扩展的日志记录类库就不那么简单了,要经过长时间的实践总结优化才可以,kohana框架中的日志记录类库已经比较成熟了,因此这里拿来借鉴。

相信使用过kohana的用户一定对kohana框架中的日志记录比较熟悉,不熟悉也没关系,我下面会大概的说说,在kohana源码中的application/bootstrap.php文件中的第109——112行可以看到下面的代码:/**

* Attach the file write to logging. Multiple writers are supported.

*/

Kohana::$log->attach(new Log_File(APPPATH.'logs'));

这个就是添加一个日志记录对象到日志对象中,注意橄榄色打底的俩个,他们是不同的类库实例,在kohana中,日志记录对象分为两部分,第一部分就是日志对象,用来维护一个日志记录对象的列表,这个要怎么理解呢,其实就像一个容器,里面包含了一个或多个日志记录对象(这个就是第二部分,这些日志记录对象才是真正来记录日志的),还有每个对象要记录的错误等级的数组,当满足错误等级的时候才会去记录,不满足就会略掉。下面是我自己简化重命名后的日志记录方式:self::$log = Log::instance();

self::$log->attach(new Logwriter("./data/debug"),Log::DEBUG);

self::$log->attach(new Logwriter("./data/notice"),Log::NOTICE);

我这里面为了更好地理解,将“容器”命名为Log,记录的实例命名为Logwriter,可以看到我在程序入口处很容易的添加了两不同的日志种类,第一个是记录所有错误号比Log::DEBUG小的错误(错误级别比他高),并按规则记录在文件夹./data/debug下面,第二个是记录级别等于或高于Log::NOTICE的错误,当然了你还可以更详细制定具体哪些错误好,传递数组就行了,这个就是我感觉方便、快捷的地方,我们可以根据需求来添加错误日志、分不同的日志目录,下面看一幅图也许会有助于理解:

log与logwriter的关系

通过上面的图你就会看到Log是一个容器,包含了具体的不同的logwriter对象,每个对象可能要记录不同的信息,当错误信息要刷到文件中的时候,会运行每一个Logwriter实例,看看自己是否要记录errormessage中的错误,errormessage中的level不包含在Logwriter内时忽略。

这本分和第一部分怎么合作的呢?

其实很简单,当exception捕获的异常时会调用添加一条错误信息(包括错误位置、错误代号、错误信息等信息)到Log容器中的errormessage数组中,然后当程序结束之后在将这些信息写入文件,这里还要注意下,也许你在阅读kohana代码是发现没有明显的直接写入到日志中去,这里面kohana优化的比较好,因为php的一次执行可能出现多个错误,如果来一个错误你就去记录一次这样会在程序返回之前占用多余的io和时间,所以kohana的做法是默认将所有的错误、异常、日志存放在Log::$errormessage中,并在实例化的时候讲Log中的writer操作注册register_shutdown_function,这个函数的作用是在程序异常终止或者执行完成之后执行,前面第一部分也有使用到,这样日志记录就不会对本次php的执行产生带大的影响。

关于全面解读PHP框架的日志系统就分享到这里了,当然并不止以上和大家分析的办法,不过小编可以保证其准确性是绝对没问题的。希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。

php全面记录日志_全面解读PHP框架的日志系统相关推荐

  1. python中的logging记录日志_[ Python入门教程 ] Python中日志记录模块logging使用实例...

    python中的logging模块用于记录日志.用户可以根据程序实现需要自定义日志输出位置.日志级别以及日志格式. 将日志内容输出到屏幕 一个最简单的logging模块使用样例,直接打印显示日志内容到 ...

  2. Mysql当前模式让不记录日志_终于有人把MySQL 三大日志讲清楚了

    日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息.mysql日志主要包括错误日志.查询日志.慢查询日志.事务日志.二进制日志几大类. 作为开发,我们重点需要关注的是二进制日志 ...

  3. 分布式框架-日志系统思路及实现

    转自:https://www.jianshu.com/p/ce30c31111ca 背景 随着互联网时代数据规模的爆发式增长,传统的单机系统在性能和可用性上已经无法胜任,分布式应用和服务化应用开始走进 ...

  4. 获取日志的等级_进阶之路:Java 日志框架全画传(中)

    导读:随着互联网和大数据的蓬勃发展,分布式日志系统以及日志分析系统得到了广泛地应用.目前,几乎在所有应用程序中,都会用到各种各样的日志框架来记录程序的运行信息.鉴于此,工程师十分有必要熟悉主流的日志记 ...

  5. 【最新最全】Java微服务实战项目【尚医疗】_智慧医疗管理项目_基于若依框架快速开发

    尚医疗是专门为各大医院.门诊提供的一款医疗管理平台.系统包含:系统管理.药品进销存管理.看病就诊.收费管理.检查管理.数据统计等核心模块.通过尚医疗系统可以快速.方便的管理病人从挂号到门诊结束所涉及到 ...

  6. 封装php框架视频教程_自编PHP框架一(数据库操作封装)

    自编PHP框架之数据库PDO层封装和模型类部分方法的编写 如果你是喷子,问我造轮子花这么多精力有什么用的话,那就走,看看我的这篇文章 为什么我要写自己的框架?框架所有的代码都在笔者的Github上做展 ...

  7. mysql8.0源代码解析_源码解读:MySQL 8.0 InnoDB无锁化设计的日志系统

    原标题:源码解读:MySQL 8.0 InnoDB无锁化设计的日志系统 作者介绍 张永翔,现任网易云RDS开发,持续关注MySQL及数据库运维领域,擅长MySQL运维,知乎ID:雁南归. MySQL ...

  8. PHP框架中的日志系统

    引言 接触过php框架的朋友们可能都知道,日志在项目中的重要作用了,他可以帮助我们定位错误的位置,让程序更友好(处理得当的话不会直接抛出一大堆只有程序猿才真正动的英文),调试的时候也会很方便,还可以记 ...

  9. ssm框架外卖订餐系统

    博主介绍:✌在职Java研发工程师.专注于程序设计.源码分享.技术交流.专注于Java技术领域和毕业设计✌ 项目名称 ssm框架外卖订餐系统 视频效果 https://www.bilibili.com ...

  10. java ssm框架的点歌系统的设计与实现源码

    项目名称 java ssm框架的点歌系统的设计与实现源码 下载地址 下载地址 系统说明 4.2 系统功能 4.2.1 登录与注册功能 系统的登录分为了前台登录和后台登录两个模块,都分别处在不同的界面上 ...

最新文章

  1. 二叉搜索树(BST)?平衡二叉树(AVL)?
  2. iOS客户端开发流程
  3. 【LeetCode笔记】494. 目标和(Java、动态规划、背包问题、滚动数组)
  4. 一统江湖的大前端(5)editorconfig + eslint——你的代码里藏着你的优雅
  5. 阿里达摩院拿什么救人?
  6. java泊松分布_Java中利用Math.random()产生服从泊松分布的随机数
  7. java poi jar包下载_poi.jar包下载
  8. 深度学习声纹识别_一种基于机器学习及深度学习的声纹降噪方法及系统与流程...
  9. 21)C语言之悬空else
  10. oracle 切换cdb,CDB与PDB之间的切换方法
  11. 【调剂】 济南大学机器学习及其应用课题组拟接收计算机硕士(调剂及第一志愿)报考-预宣传...
  12. BFS解决一般性的泊松分酒问题
  13. 头条视频消重软件 免费批量修改视频md5
  14. 树莓派Pico-Raspberry Pi Pico简介
  15. Python攻城师的成长————网络编程(socket套接字、通信循环、链接循环、黏包问题)
  16. 华为交换机配置Guest vlan
  17. python 实现邮件批量发送(你懂得)
  18. DAM | 提升品牌自播引流能力的「幕后」推手 | 数字内容管理 引流营销资源
  19. A20 Plus(esp8266与A6C)拍照传输图片
  20. VBA基础知识 提取超链接 批注转内容 工作簿内图片联动

热门文章

  1. keras调用自己训练的模型,并去掉全连接层
  2. 896.Montonic Array - LeetCode
  3. Urllib库的基本使用
  4. 解决UTF-8方法归纳
  5. jquery-修改、回退结果集
  6. nginx+php简单配置环境
  7. 【图像处理】【去模糊】图像去模糊之初探--Single Image Motion Deblurring
  8. 【LeetCode】【字符串】题号:*423. 从英文中重建数字
  9. 从零基础入门Tensorflow2.0 ----九、44.5 keras转换成具体函数
  10. 利用Python中的GDAL和OGR模块实现shapefile对栅格DEM数据的裁剪