`
烁烁Bo11
  • 浏览: 9986 次
  • 性别: 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错误与异常处理方法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP运算与运算符用法总结》、《PHP网络编程技巧...

    Laravel开发-exceptions 错误异常处理工具,支持开发和生产环境,使用 Whoops 进行错误显示

    `Laravel开发-exceptions` 涉及到的是Laravel中的错误异常处理机制,它允许开发者优雅地处理程序运行时可能出现的问题。在这个主题中,我们将深入探讨如何利用Laravel的异常处理工具,特别是结合Whoops库在开发和...

    一个显示效果非常不错的PHP错误、异常处理类

    随后定义了一个Error类,该类具备错误处理的相关功能,例如:记录错误日志、显示错误信息、保存调用堆栈信息等。Error类利用debug_backtrace()函数获取当前的调用堆栈信息,并通过反射API来获取缺失的文件和行信息。...

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

    为了解决这个问题,可以使用PHP提供的错误和异常处理机制,即使用内建的函数来实现错误和异常的拦截,并配合自定义的日志记录方法来安全地处理这些问题。 首先,我们来介绍PHP中的几个关键函数: 1. `set_...

    php实现的debug-log日志操作类.zipzip

    在PHP编程中,日志记录是一项非常重要的任务,它能够帮助开发者追踪代码执行过程中的错误、异常以及性能问题。本文将深入探讨一个基于PHP实现的debug-log日志操作类,这个类库提供了一系列方法,方便开发者高效地...

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

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

    PHP实例开发源码—LOGA 4.X 日志系统 php版utf-8.zip

    在生产环境中,当遇到错误或异常时,日志可以帮助我们理解程序的行为,而无需依赖复杂的调试工具。此外,日志还可以用于监控系统性能,识别潜在的瓶颈,以及记录安全相关的事件。 **2. PHP日志处理** PHP内置了一些...

    php实现的debug-log日志操作类

    4. **错误处理**:在尝试写入日志时,如果遇到权限问题或磁盘空间不足等错误,类应该能捕获这些异常并采取适当措施,如记录错误信息或者抛出异常。 5. **性能优化**:考虑到日志可能会影响应用性能,类可能会采用...

    基于PHP的LOGA4.X日志系统php版utf-8源码.zip

    总结,LOGA4.X作为一款强大的PHP日志系统,其丰富的功能和灵活性使得它在各种PHP项目中都能发挥重要作用。正确地使用和配置LOGA4.X,不仅能够提升开发效率,还能为系统的稳定性和安全性提供保障。

    thinkphp6自定义日志记录

    日志记录是应用程序中不可或缺的部分,它可以帮助开发者追踪程序运行状态,定位错误和异常,优化性能。本文将详细探讨在ThinkPHP6中如何自定义日志记录。 首先,理解ThinkPHP6的日志系统。框架默认集成了多种日志...

    LogHTTPrequests在Laravel应用中记录HTTP请求

    在实际使用中,我们可能会希望在特定的HTTP请求或异常情况下触发日志记录。`laravel-http-logger`提供了一些中间件,如`LogRequests`,可以在HTTP请求生命周期的不同阶段记录日志。将这个中间件添加到全局中间件堆栈...

    基于PHP的LOGA 4.X 日志系统 php版utf-8.zip

    4. **异常处理**:集成PHP的异常处理机制,当发生异常时自动记录错误日志。 四、性能优化与扩展 LOGA 4.X考虑到性能问题,提供了缓存和批量写入策略,避免频繁的磁盘或网络I/O操作。此外,通过编写自定义处理器,...

    PHP实例开发源码-阿西php多用户日志系统.zip

    4. **日志记录与查询**:PHP代码将负责接收用户输入的日志信息,将其存储到数据库中,并提供日志查询功能,允许用户按照日期、级别或其他条件筛选日志。 5. **异常处理与日志级别**:系统应具备良好的异常处理机制...

    php代码-php将所有的请求参数打印记录到日志文件

    本文将详细讲解如何使用PHP实现这个功能,包括解析请求参数、编写日志记录函数以及优化日志处理。 首先,我们需要理解HTTP请求中的参数类型。常见的请求参数有GET参数(通过URL传递)和POST参数(通过表单提交或API...

    Corner让PHP异常和错误使用户更加友好

    4. **日志记录**:在转换错误和异常的同时,Corner也会将详细信息记录到日志,以便开发者在后台分析和调试问题。这种做法既保护了用户体验,又确保了开发者有足够信息修复问题。 5. **配置与扩展**:Corner的灵活性...

    PHP实例开发源码-Essay php+html日志程序.zip

    【标题】"PHP实例开发源码-Essay php+html日志程序.zip" 提供了一个基于PHP和HTML的日志程序示例,这是一份实践性的学习资料,旨在帮助开发者理解和应用PHP语言进行网页开发,尤其是涉及到日志记录功能的实现。...

    一个能用很久的php日志类

    - `log()`: 通用的日志记录方法,可以接受任意级别的日志信息。 除了这些方法,日志类还可能包含配置选项,如设置日志文件路径、默认日志级别、日志分割策略等。在使用时,开发者可以根据项目需求进行适当的配置。 ...

    第8章 错误、异常处理与调试1

    - 使用`error_log()`将错误信息记录到日志,便于分析。 - Xdebug是一个强大的PHP调试工具,提供断点、步进执行等功能,便于深入调试。 通过学习错误处理和调试技巧,程序员可以更有效地诊断问题,提高代码质量和...

    基于PHP的Essay php+html日志程序.zip

    日志程序在Web开发中扮演着至关重要的角色,它帮助开发者追踪和诊断应用程序的行为,记录错误,以及进行性能分析。以下是关于这个主题的详细解释: 1. PHP基础:PHP(Hypertext Preprocessor)是一种广泛使用的开源...

Global site tag (gtag.js) - Google Analytics