位置: 编程技术 - 正文

全面解读PHP的Yii框架中的日志功能(php的了解)

编辑:rootadmin

推荐整理分享全面解读PHP的Yii框架中的日志功能(php的了解),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php的了解,“php”,php的理解,“php”,php yii,php概述,“php”,php yii,内容如对您有帮助,希望把文章链接给更多的朋友!

Yii页面级日志开启在 Main.php中 log段添加、下面显示页面日志 array( 'class'=>'CWebLogRoute', 'levels'=>'trace', //级别为trace 'categories'=>'system.db.*' //只显示关于数据库信息,包括数据库连接,数据库执行语句 ),完整如下:

扩展 Yii2 自带的日志组件

在配置文件中这样使用:

yii日志的逻辑Yii使用层次的日志处理机制,即日志的收集与日志最终的处理(如显示、保存到文件、保存到数据数)是分离的。日志信息的收集由CLogger(日志记录器)完成,而日志信息的分发处理,则在CLogRouter的调度(称为日志路由管理器)下,分发给处理对象(如CFileLogRoute以及logging目录下继承自CLogRoute的类, 称为日志处理器),经过反复阅读其源代码,我更是为Yii的设计思想所折服,如此的分层处理,使得其易于灵活扩展。而日志信息有级别之分,如普通的info, profile, trace, warning, error级别,可以在日志路由中设置过虑条件,如设置CFileRoute的levels属性,即可只处理指定级别的日志信息。如在程序中调用:

对应的流程可能如下:

生成CLogger实例 如果YII_DEBUG , YII_TRACE_LEVEL都已经定义为有效值,并且日志级别不是profile, 则产生调用回溯信息, 并追加到日志信息上。 调用CLogger:: log($msg,$level,$category) 收集日志,实际上这时日志并没有写入文件,仅仅是暂存于内存之中。

问题:日志是在何时被写入文件的?经过反复跟踪,我发现在CLogRouter类的init方法中为Application对象的OnEndRequest事件绑定处理器CLogRouter::processLogs()。同时也给Yii::$_logger的onFlush事件绑定事件处理器CLogRouter::collectLogs方法,用于在Yii::log()中当日志消息量过多时,及时将日志刷新写入文件。代码如下:

而在CApplication::run()方法中定义了:

到这里我们可以理解CLogger (Yii::$_logger)仅仅是将日志进行收集(记录到内容结构之中),然后在程序结束时,由$app对象调用CLogRouter的processLogs进行日志的处理。Yii支持日志多道路由,比如:同一份日志即可写入至文件,又可显示到页面上,甚至同时以电子邮件发送,更甚至同时记录到数据库中,这是由配置文件中的log:routes配置实现的,为log:routes配置多个元素,实现多个路由分发。日志信息的过滤,记录均是由最终的日志处理器处理。日志处理器要完成的任务主要包含以下几点: 从CLogger中取得所有日志,并进行过滤(主要是levels, categories两项定义log:routes:levels/categories)

全面解读PHP的Yii框架中的日志功能(php的了解)

先进行过滤参考CFileLogRoute::collectLogs()中的逻辑:

日志过滤已经完成接下来就要对日志进行最终处理(如写入到文件,记录至数据库等)

但这个函数之中,有个小bug, 只判断日志目录是否可写,没有判断日志文件本身是否可写.CFileLogRoute实现了类似Linux的日志轮换功能(LogRoate), 并规定了日志文件的大小,考虑得很周到,很完善! 我也要向其学习并吸收其思想!protected/config/main.php中的配置:

定义log组件需要预先加载(实例化)。配置使用CLogRouter作为日志路由管理器,并设置了其日志路由处理器(routes属性)及其配置属性。而preload, log属性的定义,均要应用到CWebApplication对象上(请参阅CApplication::__construct中的configure调用, configure从CModule继承而来)。而在CWebApplication的构造函数中执行preloadComponents(),就创建了log对象(即CLogRouter的实例)。创建并初始化一个组件时,实际上调用的是CModule::getComponent, 这个调用中使用YiiBase::createComponent创建组件对象,并再调用组件的init初始化之。再阅读CLogRouter::init()过程,在这里有两个关键之处,一是创建日志路由处理器(即决定日志的最终处理方式:写入文件,邮件发送等等),二是给应用程序对象绑定onEndRequest事件处理CLogRouter::processLogs()。而在CApplication::run()确实有相关代码用于运行onEndRequest事件处理句柄:

也就是说,日志的最终处理(比如写入文件,系统日志,发送邮件)是发生在应用程序运行完毕之后的。Yii使用事件机制,巧妙地实现了事件与处理句柄的关联。也就是说,当应用程序运行完毕,将执行CLogRouter::processLogs,对日志进行处理,。CLogRouter被称之为日志路由管理器。每个日志路由处理器从CLooger对象中取得相应的日志(使用过滤机制),作最终处理。具体而言Yii的日志系统,分为以下几个层次:

日志发送者,即程序中调用Yii::log($msg, $level, $category),将日志发送给CLogger对象CLogger对象负责将日志记录暂存于内存之中程序运行结束后,log组件(日志路由管理器CLogRoute)的processLogs方法被激活执行,由其逐个调用日志路由器,作日志的最后处理。

更为详细的大致过程如下:

CApplication::__construct()中调用preloadComponents, 这导致log组件(CLogRoute)被实例化,并被调用init方法初始化。 log组件(CLogRoute)的init方法中,其是初始化日志路由,并给CApplication对象onEndRequest事件绑定处理流程processLogs。给CLooger组件的onFlush事件绑定处理流程collectLogs。 应用程序的其它部分通过调用Yii::log()向CLogger组件发送日志信息,CLogger组件将日志信息暂存到内存中。 CApplication执行完毕(run方法中),会激活onEndRequest事件,绑定的事件处理器processLogs被执行,日志被写入文件之中。 Yii的日志路由机制,给日志系统扩展带来了无限的灵活。并且其多道路由处理机制,可将同一份日志信息进行多种方式处理。

这里举出一个案例:发生error级别的数据库错误时,及时给相关维护人员发送电子邮件,并同时将这些日志记录到文件之中。规划思路,发送邮件和手机短信是两个不同的功能,Yii已经带了日志邮件发送组件(logging/CEmailLogRoute.php),但这个组件中却使用了php自带的mail函数,使用mail函数需要配置php.ini中的smtp主机,并且使用非验证发送方式,这种方式在目前的实际情况下已经完全不可使用。代替地我们需要使用带验证功能的smtp发送方式。在protected/components/目录下定义日志处理器类myEmailLogRoute,并让其继承自CEmailLogRoute,最主要的目的是重写CEmailLogRoute::sendEmail()方法 ,其中,SMTP的处理细节请自行完善(本文的重点是放在如何处理日志上,而不是发送邮件上)。接下来,我们就可以定义日志路由处理,编辑protected/config/main.php, 在log组件的routes组件添加新的路由配置:

经过以上处理,即可使之实现我们的目的,当然你可以根据自己的需要进一步扩展之。

深入解析PHP的Yii框架中的event事件机制 事件事件可以将自定义代码注入到现有代码中的特定执行点。附加自定义代码到某个事件,当这个事件被触发时,这些代码就会自动执行。例如,邮件

详解PHP的Yii框架的运行机制及其路由功能 运行机制概述每一次Yii应用开始处理HTTP请求时,它都会进行一个近似的流程。用户提交指向入口脚本web/index.php的请求。入口脚本会加载配置数组并创建

PHP的Yii框架中YiiBase入口类的扩展写法示例 通过yiic.php自动创建一个应用后,入口文件初始代码如下:php//changethefollowingpathsifnecessary$yii=dirname(__FILE__).'/../yii/framework/yii.php';$config=dirname(__FILE__).'/prote

标签: php的了解

本文链接地址:https://www.jiuchutong.com/biancheng/292461.html 转载请保留说明!

上一篇:php文件缓存方法总结(php文件缓存方法有哪些)

下一篇:深入解析PHP的Yii框架中的event事件机制(php解析配置文件)

  • 企业重组的特殊性税务处理比例
  • 汇算清缴时发现去年的成本少确认了报表怎么填列
  • 现金流量补充表的编制
  • 开发票要多交费正常吗?
  • 小企业汇算清缴所得税会计分录
  • 机械租赁小规模企业所得税
  • 不开发票的入账怎么办?
  • 房地产企业会计制度
  • 合伙做生意账目
  • 堤围防护费什么时候停止征收
  • 与成本直接相关的工资怎么会计处理?
  • 股东转入投资款
  • 企业之间现金换承兑合法吗
  • 企业网上申报国税流程
  • 发票认证但未抵扣需要在报表里填吗
  • 企业拥有房产每年如何交税
  • 民非企业补贴收入要缴纳增值税会计分录怎么写?
  • 融资租赁收到租金不确认收入
  • 营改增前取得的不动产出售的计税方法
  • 房屋转租收入会计分录
  • 企业法人和股份的关系
  • 没有单价数量只有金额的发票可以用吗
  • 工业产值怎么计算的 统计
  • 账上少了25元怎么做账
  • 公司变更税务处理?
  • 库存的物资
  • mac系统怎么设置字体大小
  • win10专业版虚拟内存怎么设置
  • 无线路由器1200m覆盖范围
  • 去年的发票今年怎么做会计分录
  • linux中常用的文件类型有哪些如何区分
  • 应缴纳增值税计什么科目
  • 高德地图api获取当前经纬度的城市地图
  • 支付货款怎么做凭证
  • 商誉减值计算步骤
  • php出现错误代码怎么办
  • 房地产企业预缴税款最新规定
  • 进项税大于销项税,不用缴纳增值税
  • 自动生成尺寸
  • php用户登录界面
  • 汇算清缴应补税额为负数
  • c#怎么使用
  • 不动产集体产权证什么意思
  • 股票手续费如何计算公式
  • 企业所得税的征税对象包括( )
  • 分期收款销售的特点是描述正确的是
  • 单位食堂账目
  • 相同的商品附带不同的赠品发布
  • 长期应付账款是什么
  • 银行汇票转入银行分录
  • 社会团体会员费怎么入账
  • 2018年所得税税收优惠
  • 房地产企业取得政府补助
  • 根据出库商品的编码
  • 工程结算一般由什么等方式
  • 加计扣除要交企业所得税吗
  • 公司食堂招待客户,客户付了钱怎么入账
  • 固定资产净额怎么计算公式
  • sql server连接方式
  • MYSQL数据库应用
  • rhel6安装
  • Linux磁盘分区的作用
  • xp系统安装版合集
  • win7无法开机怎么进入安全模式
  • Linux常用命令的实验总结
  • win102020h2怎么样
  • git 进阶
  • win10家庭版免费升级专业版密钥
  • pap是什么文件
  • win7系统连接无线鼠标
  • JavaScript中的方法名不区分大小写
  • matlab中sort函数的作用
  • 安卓开发viewpager的用法
  • javascriptj
  • 兖州宁德新能源官网首页
  • 国家税务总局开票系统怎么开票
  • 北京顶点b128怎么样
  • 应交增值税减免税款借贷方向
  • ca登录的用户名和密码分别是什么
  • 如何撤销工商注册登记
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设