原文:http://www.jb51.net/article/89548.htm

-------------------------------------------------------------------------------------

本文分析了PHP中错误与异常的日志记录用法。分享给大家供大家参考,具体如下:

提到 Nginx + PHP 服务的错误日志,我们通常能想到的有 Nginx 的 access 日志、error 日志以及 PHP 的 error 日志。虽然看起来是个很简单的问题,但里面其实又牵扯到应用配置以及日志记录位置的问题,如果是在 ubuntu 等系统下使用 apt-get 的方式来安装,其自有一套较为合理的的配置文件可用。再者运行的应用程序中的配置也会影响到日志记录的方式及内容。

错误与异常的区别

关于错误与异常,我们可以用一个简单的例子来理解:

1
2
3
4
5
6
<?php
try {
 1 / 0;
} catch (Exception $e) {
 echo "catched", PHP_EOL;
}

执行这个小示例会直接得到一个『PHP Warning: Division by zero …』错误。原因很简单:这是逻辑错误,并不是异常,所以不能被 try 捕获。同样,对于变量使用前未定义这种问题,也是同样的会产生 warning 而不是被捕获。

但是这个问题在 PHP7 中却有了一些改动,比如上面的例子中我把 / 改成 %,在 PHP7 的环境中执行会得到一个不一样的提示:

PHP Fatal error: Uncaught DivisionByZeroError ...

根据这个提示,如果我把 catch 中的条件修改一下:

1
2
3
4
5
6
<?php
try {
 1 / 0;
} catch (DivisionByZeroError $e) {
 echo "catched", PHP_EOL;
}

这样就可以正常捕获到错误并输出 catched 了。

对于第一个示例,同样如果把 Excepiton 修改为 ErrorException 也可以正常捕获。

至于为什么求余和除法,在 PHP5 中提示一致而在 PHP7(我的测试环境是 7.0.4) 中除法不属于 DivisionByZeroError 的问题,这应该是个 BUG。

日志的记录

PHP 本身可配置的 log 大概有以下几个:

① php-fpm error log(php-fpm.conf 中配置,记录 php-fpm 进程的启动和终止等信息)
② php-fpm slow log(也是在 php-fpm.conf 中配置,记录慢执行)
③ php error log(php.ini 中配置,记录应用程序的错误日志)

此外 Nginx 还有两个可配置的log:access 和 error log。这几个日志文件的功能不同,记录的内容也不同。但其中有一个点需要注意:如果配置了 php-fpm 中的 error log 位置,但日志位置不可写(配置时位置得是对的,因为 php-fpm 启动时会做检查),在适当的配置条件下错误日志会被返回到 cgi 中从而写入 nginx 的 error log 中。

所以遇到问题是我们一般的查找思路都是:

1. 到 Nginx access log 中查看请求的状态码
2. 查看 php error log 中的错误记录以及 stack 信息
3. 查看 php-fpm log 中有无异常重启记录(如果核心或者扩展问题,会出现此情况)

但是在以上几种情况下你也会发现,这里面并没有上文提到的程序抛出异常的日志记录。

异常记录

异常不同于错误,严格上说它是应用程序逻辑的异常而不是错误,是可以通过合理的程序逻辑来手动触发的。但大多情况下异常也是要进行记录的,比如数据库无法连接或者框架的不当使用触发的异常,我们需要通过日志来定位问题并及时处理。

PHP 提供了两个函数用于自定义处理错误和异常的方法:

① set_error_handler

② set_exception_handler

所以可以通过 set_exception_handler 函数注入方法捕获所有的异常并记录 。

monolog是一个优秀的异常记录的库,也是基于 PSR-3 标准的实现。Laravel、Symfony 中默认也是使用它来记录异常。如有需要,也可以考虑在自己的项目中引入。

PHP中错误与异常的日志记录用法分析的更多相关文章

  1. PHP 错误与异常的日志记录

    提到 Nginx + PHP 服务的错误日志,我们通常能想到的有 Nginx 的 access 日志.error 日志以及 PHP 的 error 日志.虽然看起来是个很简单的问题,但里面其实又牵扯到 ...

  2. WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作)

    WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作) 好吧,还是那个社区APP,非管理系统,用户行为日志感觉不是很必要的,但是,错误日 ...

  3. .NET WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作)

    好吧,还是那个社区APP,非管理系统,用户行为日志感觉不是很必要的,但是,错误日志咱还是得记录则个.总不能上线后报bug了让自己手足无措吧,虽然不管有木有错误日志报bug都是件很头疼的事... 我们知 ...

  4. python中利用logging包进行日志记录时的logging.level设置选择

    之前在用python自带的logging包进行日志输出的时候发现有些logging语句没有输出,感到比较奇怪就去查了一下logging文档.然后发现其在设置和引用时的logging level会影响最 ...

  5. Go_19: Golang 中错误与异常需要重新认识

    如何进行错误处理,这是一个Go程序员之间,特别是一些新的Go程序员,会经常讨论的问题.讨论到最后往往由于以下代码的多次出现而变成了抱怨. if err != nil { return err } 我们 ...

  6. Golang 中错误与异常需要重新认识

    如何进行错误处理,这是一个Go程序员之间,特别是一些新的Go程序员,会经常讨论的问题.讨论到最后往往由于以下代码的多次出现而变成了抱怨. if err != nil { return err } 我们 ...

  7. Oracle 程序中超好用的日志记录TYPE,可以直接Copy使用

    创建类型名称:LOGGER_FACTORY Type 说明: CREATE OR REPLACE TYPE "LOGGER_FACTORY" AS OBJECT( v_progra ...

  8. js中两个感叹号的原理与用法分析(转载记录没找到原帖)

    var foo; alert(!foo);//undifined情况下,一个感叹号返回的是true; alert(!goo);//null情况下,一个感叹号返回的也是true; var o={flag ...

  9. mysql中left join right join inner join用法分析

    mysql数据库中的关联查询,基本都会用到left join,right join,inner join等查询方式,今天来说说这三种用法的区别 1.创建表test1,test2,插入测试数据 #创建表 ...

随机推荐

  1. PHP语言开发Paypal支付demo的具体实现

    如果我们的应用是面向国际的.那么支付的时候通常会考虑使用paypal.以下为个人写的一个paypal支付示例,已亲测可行.paypal有个很不错的地方就是为开发者提供了sandbox(沙箱)测试功能. ...

  2. 2199. [HZOI 2016] 活动投票

    ★★   输入文件:hztp.in   输出文件:hztp.out   简单对比 时间限制:0.5 s   内存限制:2 MB [题目描述] 衡中活动很多,人也很多,一次活动有n个学生参与投票,现已知 ...

  3. 2017-12-04HTML table布局

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. Wrapping calls to the Rational Functional Tester API——调用Rational Functional Tester封装的API

    转自:http://www.ibm.com/developerworks/lotus/library/rft-api/index.html The Rational GUI automation to ...

  5. HTML5——移动端的点击、拖拽

    移动端浏览器不支持mouse事件 https://www.cnblogs.com/joyco773/p/6519668.html https://www.cnblogs.com/yjhua/p/525 ...

  6. java多线程之内存的可见性介绍(备用1)

    (仅供参考) a.共享变量的可见能够一定程度保证线程安全,共享变量不可见导致数据不够准确,出现各种各样的问题,导致线程不安全. b.不同线程之间无法直接访问其他线程工作内存中的变量. 1.可见性 2. ...

  7. dutacm.club_1085_Water Problem_(矩阵快速幂)

    1085: Water Problem Time Limit:3000/1000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Othe ...

  8. map 用法

    map 是一种关联容器,  提供一对一的关联, 关联的形式为: KEY----VALUE     关键字不重复.multimap与map类似,但是允许关键字重复 即:关键字和与之对应的值 关键字起到索 ...

  9. 2018最新Python小白入门教程,30天学会Python

    随着Python的技术的流行,Python在为人们带来工作与生活上带来了很多的便捷,因为Python简单,学起来快,也是不少新手程序员入门的首选语言.作为一名Python爱好者,我也想跟大家分享分享我 ...

  10. vscode调试单个PHP脚本文件

    1.安装完vscode里的debug插件后, 在WorkSpace setting:添加上php的可执行文件路径: 2.下载适合自己PHP版本的Xdebug 3.在PHP目录下的php.ini配置文件 ...