在开发过程中遇到非常奇怪的问题,Yii::log()
方法无效,即使发生异常时也没有任何日志输出。Yii 框架肯定不会有问题,根据经验一般问题都出现在目录权限或者框架配置上。
先说结论,这次问题在于配置文件中 'preload' => array('log'),
一行被他人错误的注释掉了,解开注释后日志打印恢复正常。
还有一种可能,当使用 tail -f application.log 查看日志时,若 application.log 文件刚好写满,也不会有日志滚动!退出重新执行 tail 以跟踪新的日志文件。
下面记录一下排查方法,顺便了解一下 Yii 框架日志记录原理:
首先说明大致原理:Yii 框架中日志在内存中有 “缓冲区” 的存在,就是说,并非每次 Yii::log()
执行都会向文件中写入。当缓冲区写入次数超过阈值、或者当一次请求完成时,从缓冲区中读取数据写入日志文件。
日志写入逻辑如下: Yii::log()
=> YiiBase::log()
=> (根据配置选择是否记录 Stack Trace)=> CLogger::log()
=> 写入缓冲区(CLogger::$_logs 数组)、判断写入次数阈值 => 不满足刷新条件,什么都不做;满足刷新条件,触发 onFlush 事件
onFlush 事件触发逻辑:CLogRouter::init()
注册 onFlush 处理器为 <