PHP编程:PHP的Yii框架的常用日志操作总结
《PHP的Yii框架的常用日志操作总结》要点: PHP应用日志 使用Yii的日志框架包括如下步骤: 调用日志记录的办法
记录日志其实就是简简单单的调用如下的办法:
上面的这些办法虽然根据不同的level和类型来记录信息,但是实际上它们调用的是同一个办法function($message,$category = 'application').其中$message就是要记录的信息,$category表示的是这个日志的归属类.下面的代码表示在默认的‘application'分类下面记录了一条trace类型的信息. Yii::trace('start calculating average revenue'); 提示:记录的$message可以是简单的string也可以是复杂的数组、对象.你应该根据不同的场景下日志记录的职责选取合适的$message类型.默认情况下,如果你记录的$message不是String,日志在导出的时候都会调用[[yiihelpersVarDumper::export()]] 办法来输出一个string类型的消息. 为了更好的组织管理及筛选日志消息,通常情况下应当为每一种日志分配合适的类别.你可以选择一种有明显等级区分意思的分类,用以方便根据不同的目的来筛选不同分类的日志.一种简单且有效的命名方式就是使用PHP的魔术常量METHOD来作为分类的名称.Yii框架里面的核心代码在做日志记录的时候就是这么干的.好比说: Yii::trace('start calculating average revenue',__METHOD__); 在有常量METHOD出现的地方,它表示的就是当前的办法的名称(并且加上了当前办法所属的类的完整前缀).举个例子吧,如果在appcontrollersRevenueController这个类里面的calculate办法里面有上面的那行代码,那么此时的METHOD表示的就是‘appcontrollersRevenueController::calculate'. 提示:上面所说的办法事实上只是单例对象[[yiilogLogger|logger object]] 的[[yiilogLogger::log()|log()]]办法的简单使用,我们可以通过Yii::getLogger()办法来获得这个单例对象.当我们记录了足够的日志信息或者当前的应用运行结束了,日志对象将调用[yiilogDispatcher|message dispatcher]] 办法把记录的日志信息写入到配置的目的位置. log targets return [ // the "log" component must be loaded during bootstrapping time 'bootstrap' => ['log'],'components' => [ 'log' => [ 'targets' => [ [ 'class' => 'yiilogDbTarget','levels' => ['error','warning'],],[ 'class' => 'yiilogEmailTarget','levels' => ['error'],'categories' => ['yiidb*'],'message' => [ 'from' => ['log@example.com'],'to' => ['admin@example.com','developer@example.com'],'subject' => 'Database errors at example.com',]; 注意:日志组件必需在bootstrap中配置,这样才能把日志信息分发到对应的log target. 第一个筛选出错误和警告信息并且把这些信息保留到了数据库.
接下来,我们就来看看常见的log target具有的功能. 消息过滤
如果你没有指定[[yiilogTarget::levels|levels]] 的值,那么任何level的信息都会被记录. [[yiilogTarget::categories|categories]] 属性的值是数组,这个数组里面的值可以是一个具体的分类名称,也可以是类似正则的匹配模式.只有在target能在这个数组里面找到对应的分类名或者符合某一个匹配模式,他才会处理这些消息.这里的匹配模式的组成是在分类的名称后面加上一个号.如果这个分类恰好和这个匹配模式的号前的字符匹配,那么也就是这个分类找到对应匹配值.举个例来说,在类[[yiidbCommand]]中的yiidbCommand::execute和yii dbCommand:: query 办法使用类名类记录相关日志信息,那么这个时候他们都匹配模式yiidb* 同样的,如果我们没有指定[[yiilogTarget::categories|categories]],那么每一种分类的日志信息都会被处理. 下面的配置指定了一个分类匹配yiidb*或者 yiiwebHttpException:*,但又不包含yiiwebHttpException:404的分类,而且它只处理错误和警告的日志信息. [ 'class' => 'yiilogFileTarget','categories' => [ 'yiidb*','yiiwebHttpException:*','except' => [ 'yiiwebHttpException:404',] 注意:当错误的句柄捕捉到HTTP的异常的时候,记录的日志信息会以yiiwebHttpException:ErrorCode的这种格式
记录,例如[[yiiwebNotFoundHttpException]] 就会被记录成yiiwebHttpException:404 消息格式化 日志targets用多种格式来导出日志.举个例子,如果你的日志target是[[yiilogFileTarget]],那么你在你的程序中记录日志的时候,应该会找到类似于文件runtime/log/app.log 记录的如下的信息: 2014-10-04 18:10:15 [::1][][-][trace][yiibaseModule::getModule] Loading module: debug 默认情况下,[[yiilogTarget::formatMessage()]]:会帮我们把日志信息格式化成下面的这种格式: Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text 你可以通过给[[yiilogTarget::prefix]] 属性配置一个自定义的回调函数来 自定义日志的前缀.下面的代码就实现了在每条日志信息前面加上了用户的ID(ip地址,sessionId等敏感信息因为个人隐私被去掉了). [ 'class' => 'yiilogFileTarget','prefix' => function ($message) { $user = Yii::$app->has('user',true) ? Yii::$app->get('user') : null; $userID = $user ? $user->getId(false) : '-'; return "[$userID]"; } ] 除了日志消息的前缀,日志的target还把一些上下文信息附加在了每一批的日志记录中.默认情况下,全局的PHP变量包括$_GET,$_POST,$_FILES,$_COOKIE,$_SESSION 和 $_SERVER. 你可以通过配置 [[yiilogTarget::logVars]] 来调整日志记录的全局变量.下面的代码表示的是只记录$_SERVER相关的变量. [ 'class' => 'yiilogFileTarget','logVars' => ['_SERVER'],] 当 'logVars'为空的时候,表示不记录相关的上下文信息.如果你想自定义上下文信息的提供方式,你可以覆写[[yiilogTarget::getContextMessage()]] 办法. 消息的trace等级 return [ 'bootstrap' => ['log'],'components' => [ 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0,'targets' => [...],]; 上面的示例在YII_DEBUG为true的时候将[[yiilogDispatcher::traceLevel|traceLevel]] 设置为3,反之设置为0. 意思是什么呢?3表现每一条日志记录都会记录与之相关的三层栈调用信息,0表现不记录任何相关的栈调用信息 提示:没有必要总是记录调用的堆栈信息,比较耗性能.所以,你应该只在你开发的时候或者用于调试的情况下使用该功能. return [ 'bootstrap' => ['log'],'components' => [ 'log' => [ 'flushInterval' => 100,// default is 1000 'targets' => [...],]; 注意:在应用运行结束的时候也会刷新内存,这样办事为了让日志的target能够记录完整的信息. [ 'class' => 'yiilogFileTarget','exportInterval' => 100,// default is 1000 ] 因为清空和导出的设定,默认情况下你调用 Yii::trace() 或者其他的日志记录办法的时候不会在日志target下立马看到日志消息.这对某些长时间运行的控制台程序是一个问题.不过这个问题是可以解决的,办法入下面的代码,你需要把[[yiilogDispatcher::flushInterval|flushInterval]] 和[[yiilogTarget::exportInterval|exportInterval]] 的值都设置成1: return [ 'bootstrap' => ['log'],'components' => [ 'log' => [ 'flushInterval' => 1,'targets' => [ [ 'class' => 'yiilogFileTarget','exportInterval' => 1,]; 注意:如此频繁的清空和导出日志消息会降低系统的性能. Yii::$app->log->targets['file']->enabled = false; 上面的代码必要你在配置文件里面有一个下面的配置: return [ 'bootstrap' => ['log'],'components' => [ 'log' => [ 'targets' => [ 'file' => [ 'class' => 'yiilogFileTarget','db' => [ 'class' => 'yiilogDbTarget',]; 创建一个新的target 性能评测 要使用该类日志,你首先要做的时确定你要测试的代码范围.然后在每一段代码之间你都应该要坚持它们是闭合的,就像下面这个样子: Yii::beginProfile('myBenchmark'); ...code block being profiled... Yii::endProfile('myBenchmark'); myBenchmark只是一个标识,用于你在查看对应日志记录的时候快速定位. Yii::beginProfile('block1'); // some code to be profiled Yii::beginProfile('block2'); // some other code to be profiled Yii::endProfile('block2'); Yii::endProfile('block1'); 如果上面的闭合关系出错了,对应的记录都不会正常工作. 对于每一块被评测的代码,日志的level都是profile.你可以再日志的target中配置这些信息并导出它们. Yii内建了 Yii debugger来展示评测的成果. 欢迎参与《PHP的Yii框架的常用日志操作总结》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |