MyException - 我的异常网
当前位置:我的异常网» PHP » 【Yii系列】异常处理和日志系统

【Yii系列】异常处理和日志系统

www.MyException.Cn  网友分享于:2013-04-21  浏览:0次
【Yii系列】错误处理和日志系统

缘起

跟随上一章的脚步,上一章中,我们主要讲解了在用户发起请求,解析请求,服务器反馈请求以及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' => [[email protected]'],
                       'to' => [[email protected]', [email protected]'],
                       '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的空间供你使用,这是个巨坑。

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

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

文章评论

鲜为人知的编程真相
鲜为人知的编程真相
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
为什么程序员都是夜猫子
为什么程序员都是夜猫子
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
我的丈夫是个程序员
我的丈夫是个程序员
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
Java程序员必看电影
Java程序员必看电影
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员的鄙视链
程序员的鄙视链
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
老程序员的下场
老程序员的下场
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
旅行,写作,编程
旅行,写作,编程
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
一个程序员的时间管理
一个程序员的时间管理
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员必看的十大电影
程序员必看的十大电影
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
 程序员的样子
程序员的样子
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
中美印日四国程序员比较
中美印日四国程序员比较
每天工作4小时的程序员
每天工作4小时的程序员
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
漫画:程序员的工作
漫画:程序员的工作
代码女神横空出世
代码女神横空出世
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
如何成为一名黑客
如何成为一名黑客
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
我是如何打败拖延症的
我是如何打败拖延症的
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有