`
烁烁Bo11
  • 浏览: 9196 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

PHP的日志记录-错误与异常记录

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

错误与异常的区别
关于错误与异常,兄弟连来给大家举一个简单的例子来理解:

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

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

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

PHP Fatal error: Uncaught DivisionByZeroError ...
根据这个提示,如果我把 catch 中的条件修改一下:

<?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 中。

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

到 Nginx access log 中查看请求的状态码
查看 php error log 中的错误记录以及 stack 信息
查看 php-fpm log 中有无异常重启记录(如果核心或者扩展问题,会出现此情况)
但是在以上几种情况下你也会发现,这里面并没有上文提到的程序抛出异常的日志记录。

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

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

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

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

相关推荐

    PHP中错误与异常的日志记录用法分析

    主要介绍了PHP中错误与异常的日志记录用法,较为详细的分析了php中错误与异常的区别以及日志记录的相应使用技巧,需要的朋友可以参考下

    rabbitmq-logger:记录错误和异常int Rabbitmq交换

    将错误和异常记录为int Rabbitmq交换。 Rabbitmq Logger为提供了两个扩展。 RabbitMqLoggerExtension用于将错误/异常记录到rabbitmq范围中。 您应该在要将错误消息记录到rabbitmq的所有项目上使用此扩展名。 ...

    rollbar-php:从PHP到Rollbar的错误跟踪和日志记录

    该库检测应用程序中的错误和异常,并将它们发送到以进行警报,报告和分析。 快速开始 如果您以前从未使用过Rollbar,请然后按照简单的三步导览进行操作。 您将立即捕获代码中引发的错误和异常。 如果您已经有一个...

    PHP各种异常和错误的拦截方法及发生致命错误时进行报警

    在日常开发中,大多数人的做法是在开发环境时开启调试模式,在产品环境关闭调试模式。...种种以上,都是因为大家关闭了错误信息,并且未将错误、异常记录到日志,导致那些随机发生的错误很难追踪。这样矛盾就来了

    php调试手册适合新手php开发者

    1.2 错误控制和日志记录调试 1.2.1 错误选项控制 1.2.2 错误抛出和处理 1.2.3 使用错误抑制符 1.2.4 日志记录 2 浏览器调试 2.1 页面输出调试 2.2 FirePHP 调试 2.2.1 普通变量监测 2.2.2 调用栈监测 2.2.3 监测抛出...

    laravel-console-logger:Laravel控制台命令的日志记录和通知

    Laravel控制台记录仪 Laravel控制台命令的日志记录和通知。 Laravel控制台记录仪8.x 7.x 6.x 5.8。* 5.7。* 5.6。* 5.5。* 5.5。* 5.4。* 5.4。* 5.3。* 5.3。* 5.2。* 5.2。* 5.1。* 5.1。* 目录用法可用方法频道数...

    Laravel 5.5 异常处理 & 错误日志的解决

    此外,Laravel 还集成了 Monolog 日志库以便提供各种功能强大的日志处理器,默认情况下,Laravel 已经为我们配置了一些处理器,我们可以选择单个日志文件,也可以选择记录错误信息到系统日志。 配置 调试模式 配置...

    EXS-silex-error-provider:在silex应用程序中捕获php错误和异常

    捕获所有服务器端错误,然后将其记录在错误日志文件中。 然后,console命令将文件的内容移动到db中。 在Silex项目中安装ErrorProvider 安装过程实际上非常简单。 使用Composer设置Silex项目。 设置新项目后,打开...

    PHP调试技术手册.pdf

    1.2 错误控制和日志记录调试 1.2.1 错误选项控制 1.2.2 错误抛出和处理 1.2.3 使用错误抑制符 1.2.4 日志记录 2 浏览器调试 2.1 页面输出调试 2.2 FirePHP 调试 2.2.1 普通变量监测 2.2.2 调用栈监测 2.2.3 监测抛出...

    X-Cart Gold 4.5.4.zip

    ] 2012年10月16日,目标 - 问题(0106826):不正确的错误信息显示不正确的邮编场(第3行的错误:未知的用户的地址簿记录)。固定的。 *图片* [!10月16日的2012年的目标 - 问题(0126053):详细的图像,:预览...

    PHP调试技术手册 1.0.rar

    1.2 错误控制和日志记录调试 1.2.1 错误选项控制 1.2.2 错误抛出和处理 1.2.3 使用错误抑制符 1.2.4 日志记录 2 浏览器调试 2.1 页面输出调试 2.2 FirePHP 调试 2.2.1 普通变量监测 2.2.2 调用栈监测 ...

    php网络开发完全手册

    10.4 异常的传递与重掷 163 10.5 小结 165 第11章 PHP与表单 166 11.1 HTML表单简介 166 11.1.1 表单标签form 166 11.1.2 输入标签input与文本框 167 11.1.3 按钮 168 11.1.4 单选框与复选框 169 11.1.5 多行文本域...

    MiniFramework 1.4.0.zip

    MiniFramework 1.4.0 更新日志:2018-09-13新增Log类,用于以日志的形式记录代码运行报错和开发者自定义的调试信息;新增常量LOG_ON,用于控制日志功能的开启和关闭(生产环境建议关闭);新增常量LOG_LEVEL,用于定义...

    PHP语言开发常见问题解决办法入门总结.docx

    技巧要点:使用try-catch结构捕获和处理异常,设置适当的错误报告级别,并且在生产环境中关闭显示错误信息,转而记录错误日志。 预处理SQL语句 技巧举例:在使用mysqli或PDO扩展操作数据库时,采用预处理语句防止...

    Laravel 5.3 学习笔记之 错误&日志

    此外,Laravel还集成了Monolog日志库以便提供各种功能强大的日志处理器,默认情况下,Laravel已经为我们配置了一些处理器,我们可以选择单个日志文件,也可以选择记录错误信息到系统日志。 2、配置 错误详情显示 ...

    与RFC 7807兼容的PSR-15中间件-PHP开发

    但是,它们中的大多数(如果不是全部)都将内容协商,日志记录和格式化与错误处理混合在一起。 有些甚至迫使您抛出特定类型的异常以使其起作用。 我认为这些并不是最佳的设计决策,我们需要更大的灵活性来解决此问题...

    用PHP即时捕捉PHP中的错误并发送email通知的实现代码

    开发PHP的朋友都知道,其实最担心的就是程序中出现一些异常或错误,这些状况如果输出到用户的萤幕会把用户给吓坏,甚至为此丢了工作,如果不输出到萤幕就得想办法记录到日志中,但是似乎不是每个人都有查看错误日志的习惯...

    laravel-log-enhancer:通过向您的laravel日志中添加更多数据来简化调试(Laravel 5.6+)

    Laravel的日志记录系统在存储数据以及对某些隐藏的错误进行故障排除方面大有帮助。 每当出现问题时,与异常相关的数据都会自动记录下来。 有时,我们不仅需要堆栈跟踪来轻松调试问题。 诸如请求URL ,请求输入数据...

    PHP和MySQL Web开发第4版pdf以及源码

    15.9 审计与日志记录 15.10 防火墙 15.11 备份数据 15.11.1 备份常规文件 15.11.2 备份与恢复MySQL数据库 15.12 自然环境安全 15.13 下一章 第16章 Web应用的安全 16.1处理安全性问题的策略 16.1.1 以正确...

Global site tag (gtag.js) - Google Analytics