引言
接触过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的执行产生带大的影响。

参考网站:
https://github.com/AizuYan/ph...

PHP框架中的日志系统相关推荐

  1. 大型互联网应用中的日志系统

    2019独角兽企业重金招聘Python工程师标准>>> 大型互联网应用的突出特点是应用本身规模大,结构复杂,用户访问量大.设计良好的日志系统,有助于分析流量趋势,帮助管理网络应用:有 ...

  2. java中logger_Java日志系统---Logger之简单入门

    Java 中自带的日志系统,今天抽空了解了一点,算是入了门,所以将自己的一些心得记录下来,以备日后查看,有兴趣的朋友,看到此文章,觉得有错误或需要添加的地方,请在下方评论留言,大家可以共同进步,谢谢: ...

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

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

  4. go语言 gin框架中集成zap日志库

    在go语言gin框架中,日志是默认输出到终端的,但是我们在实际工作中,一般来说是需要记录服务器日志的.而最常用的日志库就是zap日志库,我们需要将gin在终端输出的内容通过zap日志库记录到文件中,首 ...

  5. 9 个技巧,解决 K8s 中的日志输出问题

    作者 | 元乙  阿里云存储服务技术专家 导读:近年来,越来越多的同学咨询如何为 Kubernetes 构建一个日志系统,或者是来求助在此过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是作者想 ...

  6. 通用日志系统开发【转】

    1.前言 中大型软件项目中,日志系统是不可或缺的组成部分.尤其随着软件规模越来越大,内部结构越来越复杂,日志调试成为一种重要的调试方法.本文介绍了一个通用,高效,简洁的日志系统的设计思路. 文章分两部 ...

  7. c 语言 宏 可变 参数,利用C可变参数和宏定义来实现自己的日志系统

    在嵌入式应用的开发过程中,日志系统是非常重要的! 特别是在生产环节出现了偶发性的.与当前的执行环境相关的bug的时候, 如果没有日志系统来追踪问题,很难进行问题重现. 因此,实现一个自己的日志系统是很 ...

  8. python后台架构Django教程——日志系统

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python日志的相关内容可以先参考:http://blog.csdn.net/luanpeng825485697/article/detai ...

  9. error 系统错误 错误码10007_为什么阿里巴巴禁止工程师直接使用日志系统( Log4j 、Logback )中的 API...

    (给ImportNew加星标,提高Java技能) 转自:Hollis 作为Java程序员,我想很多人都知道日志对于一个程序的重要性,尤其是Web应用.很多时候,日志可能是我们了解应用程序如何执行的唯一 ...

最新文章

  1. 厉害!苏炳添即将在暨南大学成立短跑实验室
  2. SAP ERP系统之库存参数选择与优化
  3. Linux文本处理之printf:规定输出内容与样式 %规定内容样式 \规定排版样式
  4. swfupload 进度条 提示 中文乱码
  5. Spring常见面试题
  6. FLEX:使用setTimeout,setInterval ,实现sleep功能(转)
  7. 消息推送生命周期_一套完整的APP推送体系方案|附思维导图
  8. 元宵节快乐 | 2月15日 星期二 | 携程在国内率先开启混合办公模式;米哈游推出元宇宙品牌;AMD宣布完成对赛灵思的收购...
  9. 数据挖掘项目:银行信用评分卡建模分析(上篇)
  10. 重新加载maven项目的依赖项
  11. 系统集成项目管理工程师(中级)考试心得经验
  12. win11-删除账户导致输入正确密码也无法卡机(windows无法进入系统)
  13. 百钱买小鸡/*公鸡5文钱1只,母鸡三文钱一只,小鸡一文钱三只。现在用100文钱共买了100只鸡,问这100只鸡中,公鸡,母鸡,小鸡各是多少只?
  14. 【历史上的今天】1 月 18 日:微软的“技术布道者”出生;反盗版法案抗议行动;哈佛 Mark I 灵感起源
  15. MybatisPlus代码生成器报错AutoGenerator()‘ has private access in ‘com.baomidou.
  16. 有限体积法(2)——二维、三维扩散方程的离散推导
  17. 【深度学习环境配置】手把手实战配置深度学习环境(win10版)
  18. 数据库设计(理论实例)
  19. 【2022/2023年硕士研究生408计算机学科考试大纲原文】+【2009-2021年408统考真题+解析PDF】
  20. 安排 , 2021新冠疫情防控指挥作战平台(视频+课件+代码+资料)

热门文章

  1. 物联网基石,五大领域对智能传感器的需求暴涨
  2. 2018-2020年Gartner战略科技发展趋势一览!
  3. 重磅推荐:中国人工智能趋势报告(完整版)
  4. 汽车与智能家居互联时代 语音控制很关键
  5. 智能的源泉,大脑从何而来?
  6. 2018-2020年中国服务机器人行业深度研究报告
  7. Cognizant:走向2028年将诞生的21个新工作
  8. 那个每天半夜发加班朋友圈的程序员,你给我站住!
  9. 坐在隔壁的00后同事,让我看到了职场“反内卷”的希望
  10. 阿里“火拼”拼多多,要“1元”抢占下沉市场