缘起

跟随上一章的脚步,上一章中,我们主要讲解了在用户发起请求,解析请求,服务器反馈请求以及session的一些知识点,这过程中,难免会遇到一些问题,比方说数据库查询失败,用户输入导致脚本出错,网络问题等等突发情况,对于突发情况,做过软件的一般都知道,会有错误处理和日志去记录下这个过程,同样的,Yii也提供了类似的功能帮助我们去抓住错误,记录错误,并且对相应错误做出对应处理。

错误处理

Yii 内置了一个error handler错误处理器。

所有非致命PHP错误(如,警告,提示)会转换成可获取异常。

抛出异常

use yii\web\NotFoundHttpException;

throw new NotFoundHttpException();

对于可能产生异常的地方,我们要使用try...catch...

use Yii;
use yii\base\ErrorException; try {
10/0;
} catch (ErrorException $e) {
Yii::warning("Division by zero.");
}

error handler 错误处理器默认启用。

return [
'components' => [
'errorHandler' => [
'errorAction' => 'site/error',
],
]
];

一般的保留原先应用主体中的配置即可,如果想要定制化错误的格式输出,可以去官网好好研究研究呢,这里不细究,错误产生,打印出来即可,至于如何记录下来,方便我们查找,这才是重要的。

日志系统

提起日志系统,大伙可能第一个想到的就是在适当的位置插入一行代码,然后执行到这行代码之后就会被记录一些东西到一个文件中。

是的,这就是最原始的日志系统,之前搞的Python自动发邮件的那个日志记录系统就是这么简单的一个玩意儿,但是收到的成效会非常好。就和程序员写注释一样,在对的位置加上log,这会大大降低你系统的维护成本。

Yii提供了一个强大的日志框架,这个框架具有高度的可定制性和可扩展性。

调用起来也相当简单

Yii::trace():记录一条消息去跟踪一段代码是怎样运行的。这主要在开发的时候使用。
Yii::info():记录一条消息来传达一些有用的信息。
Yii::warning():记录一个警告消息用来指示一些已经发生的意外。
Yii::error():记录一个致命的错误,这个错误应该尽快被检查。

上面的这几个日志类型是根据严重程度来记录的

exception需要记录到warning和error里面

重要的日志信息会单独记录到单独的key中,方便查找,就是这些个方法的第二个参数:category,这个参数是可以自定义的。这和你的配置有关,如下是一个比较标准的配置log的方式。

return [
// the "log" component must be loaded during bootstrapping time
'bootstrap' => ['log'], 'components' => [
'log' => [
'targets' => [
[
'class' => 'yii\log\DbTarget',
'levels' => ['error', 'warning'],
],
[
'class' => 'yii\log\EmailTarget',
'levels' => ['error'],
'categories' => ['yii\db\*'],
'message' => [
'from' => ['log@example.com'],
'to' => ['admin@example.com', 'developer@example.com'],
'subject' => 'Database errors at example.com',
],
],
],
],
],
];

log 组件必须在 bootstrapping 期间就被加载,以便于它能够及时调度日志消息到目标里。

上面的error和warning会被以存储到数据表的形式存储,我一般都会存储在runtime的log下面,以文件的方式去存储,过一周时间备份下这些log,然后从服务器删除掉这些log。

第二个是error的时候要给admin和developer两个example.com邮箱发送邮件。

Yii配备了以下的内建日志目标。

yii\log\DbTarget:在数据库表里存储日志消息。
yii\log\EmailTarget:发送日志消息到预先指定的邮箱地址。
yii\log\FileTarget:保存日志消息到文件中.
yii\log\SyslogTarget:通过调用PHP函数 syslog() 将日志消息保存到系统日志里。

我一般使用的就是那个FileTarget,配置如下:

'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
[
'class' => 'yii\log\FileTarget',
'categories' => ['tongzi.info.*', 'yii\db\*'],
'levels' => ['info'],
'logVars' => [],
]
], ]

上面的应用配置设置了 yii\log\Dispatcher::traceLevel 的层级,假如 YII_DEBUG 开启则是3,否则是0。

这意味着,假如 YII_DEBUG 开启,每个日志消息在日志消息被记录的时候, 将被追加最多3个调用堆栈层级;假如 YII_DEBUG 关闭, 那么将没有调用堆栈信息被包含。

categories 属性是一个包含消息分类名称或者模式的数组。

一个分类模式是一个以星号 * 结尾的分类名前缀。假如一个分类名与分类模式具有相同的前缀, 那么该分类名将和分类模式相匹配。

消息的格式

如果你使用了yii\log\FileTarget类的日志目标,你的消息格式应该是下面的~

2014-10-04 18:10:15 [::1][][-][trace][yii\base\Module::getModule] Loading module: debug

默认情况下,日志消息将被格式化,格式化的方式遵循 yii\log\Target::formatMessage():

Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text

也可以自定义日志格式,不过完全没有必要那么搞,这么多的信息足够查错啦。

另外,定义好各个category后,你就可以使用各种工具查看log啦。

这边推荐大家使用两个日志分析工具,splunk和日志易,splunk,我有个同学在里面,做大数据分析算法,反正我觉得挺牛,Splunk在全球大数据分析首屈一指。而且界面也很友好,只是免费版的只有500M的空间供你使用,这是个巨坑。

还有一个就是日志易啦,也是我目前在用的日志分析工具,国内比较好的工具,大家可以去到他的官网研究搞搞事情,挺不错的。

好了,今天关于错误处理和日志系统相关的就讲到这儿^_^

【Yii系列】错误处理和日志系统的更多相关文章

  1. 【Yii系列】处理请求

    缘起 这一章是Yii系列的第三章,前两章给大伙讲解了Yii2.0的安装与Yii2.0的基本框架及基础概念,传送门: [Yii2.0的安装与调试]:http://www.cnblogs.com/rive ...

  2. Android性能优化之UncaughtExceptionHandler定制自己的错误日志系统

    前言: 每当我们app测试的时候,测试人员总是对我们说这里崩溃了,那里挂掉了!我们只能默默接受,然后尝试着重现bug,更可悲的是有时候bug很难复现,为了解决这种现状所以我们要尝试这建立一个自己的bu ...

  3. 基于sentry的前端错误监控日志系统(部署sentry服务器/前端项目部署)-让前端最快的定位到生产问题

    背景 在这越来越发达的网络时代,web应用也是越来越复杂,尤其是前端的开发,也是越来越受重视. 所以在我们前端开发完成后,会有一些列的web应用的上线验证,如自测.QA测试.code review 等 ...

  4. k8s系列---EFK日志系统

    文章拷于:http://blog.itpub.net/28916011/viewspace-2216748/   用于自己备份记录错误 一个完整的k8s集群,应该包含如下六大部分:kube-dns.i ...

  5. 【Yii系列】Yii2.0基础框架

    缘起 因为一个月的短暂停留,我在给朋友搞事情,所以Yii系列的文章耽搁了很长时间,现在又重拾当时的知识,给大伙好好撸下这一系列的博客 提起Yii,虽然是国外的开发者搞的,但是它的作者是华人,这才是让我 ...

  6. C++ 高性能无锁日志系统

    服务器编程中,日志系统需要满足几个条件 .高效,日志系统不应占用太多资源 .简洁,为了一个简单的日志功能引入大量第三方代码未必值得 .线程安全,服务器中各个线程都能同时写出日志 .轮替,服务器不出故障 ...

  7. 创业公司做数据分析(四)ELK日志系统 (转)

    http://blog.csdn.net/zwgdft/article/details/53842574 作为系列文章的第四篇,本文将重点探讨数据采集层中的ELK日志系统.日志,指的是后台服务中产生的 ...

  8. 创业公司做数据分析(四)ELK日志系统

      作为系列文章的第四篇.本文将重点探讨数据採集层中的ELK日志系统.日志.指的是后台服务中产生的log信息,一般会输入到不同的文件里.比方Django服务下,一般会有nginx日志和uWSGI日志. ...

  9. 6 个 K8s 日志系统建设中的典型问题,你遇到过几个?

    作者 |  元乙  阿里云日志服务数据采集客户端负责人,目前采集客户端 logtail 在集团百万规模部署,每天采集上万应用数 PB 数据,经历多次双 11.双 12 考验. 导读:随着 K8s 不断 ...

随机推荐

  1. 关于如何用js完成全选反选框等内容

    在学习js过程中按照视频写了这个页面 可以在点上面全选/全不选时全部选中或者取消 在单击下面的单选框时上面的全选会根据下面的单选框进行相应的调整 功能比较完善 以下是代码 <!DOCTYPE h ...

  2. Mac 10.12安装Command+Q误按提示工具

    说明:很多时候不小心会按强制关闭而无任何提示,这款工具能延迟关闭,并有相应的提示. 下载: (链接: https://pan.baidu.com/s/1bpyJMPL 密码: bqn1)

  3. (转)mysql主从切换步骤

    原文:http://6226001001.blog.51cto.com/9243584/1723273 1> 正常切换 1)从服务器检查SHOW PROCESSLIST语句的输出,直到你看到Ha ...

  4. 用Akka构建一个简易的分布式文件系统

    本来初期打算用Hadoop 2,可是后来有限的服务器部署了Solr Cloud,各种站点,发现资源不够了,近10T的文件,已经几乎把服务器的磁盘全部用光.想来想去,由于目前架构基于Scala的,所以还 ...

  5. git push.default 几种设置笔记

    1 simple ,本地和远程分支同名才会推送,只会推送当前的分支到远程 ,默认推送分支数量:1 2 matching , 会推送匹配的本地分之到远程分之,假如本地有的分支远程没有,不会把本地推送到远 ...

  6. 关于svn插件突然失效问题

    这个分享一下 安装  MyBatisGenerator 插件 之后,svn失效,删掉mybatis 后,svn就恢复正常...这怎么割 一翻折腾无效,后来发现  MyBatisGenerator  和 ...

  7. Tomcat源码分析——Session管理分析(上)

    前言 对于广大java开发者而已,对于J2EE规范中的Session应该并不陌生,我们可以使用Session管理用户的会话信息,最常见的就是拿Session用来存放用户登录.身份.权限及状态等信息.对 ...

  8. scala笔记,主要摘自网络教程

    1.scala是一种纯面向对象的语言,每个值都是对象.对象的数据类型以及行为由类和特质描述 2.类的扩展有2种机制:继承和混入机制 3.scala是一种函数式语言,其函数也能当成值来使用 ==4.sc ...

  9. SQL 之连接查询

    概述:INNER JOIN.LEFT JOIN.LIGHT JOIN.FULL JOIN. 一.INNER JOIN INNER JOIN 关键字在表中存在至少一个匹配时返回行. 语法: select ...

  10. ecstore关于smarty语法调用

    以下是smarty语法 转自http://www.phpwindow.com/ecstore_smarty2.html assign 属性 类型 是否必须 描述 var string yes 被赋值的 ...