PHP框架中的日志系统

  介绍

这篇文章主要介绍了PHP框架中的日志系统,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。

<强>引言

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

<强>简介

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

<强>一、PHP的几个函数

set_exception_handler exception_handler美元(回调);//异常捕获自定义处理函数注册

set_error_handler error_handler美元(回调);//错误捕获自定义处理函数注册

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

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

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

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

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

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

 php框架中的日志系统

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

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

这里面用的是数组(类,函数)这种方式。

set_exception_handler(数组(“Myexception",“exceptionHandler"));   set_error_handler(数组(“Myexception",“errorHandler"));   register_shutdown_function(数组(“Myexception",“shutdownHandler"));

<强>二,日志记录相关类库

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

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

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

/* *   *附加文件写入日志。支持多个作家。   */Kohana:日志→美元附加(新Log_File (APPPATH强生# 39;日志# 39;));

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

PHP框架中的日志系统