如何在PHP中记录未捕获的异常?

时间:2008-08-21 15:54:15

标签: php exception error-handling error-logging

我已经发现了如何将错误转换为异常,如果没有捕获它们,我会很好地显示它们,但我不知道如何以有用的方式记录它们。简单地将它们写入文件将没有用,是吗?当你不知道导致异常的原因时,你会冒险访问数据库吗?

7 个答案:

答案 0 :(得分:11)

您可以使用set_error_handler设置自定义异常以记录错误。我个人考虑将它们存储在数据库中,因为默认的Exception处理程序的回溯可以提供导致它的原因的信息 - 当然,如果数据库处理程序触发了异常,这当然是不可能的。

您还可以使用error_log来记录错误。它有多种消息目的地,包括:

  

引自error_log

     
      
  1. PHP的系统记录器,使用操作系统的系统日志记录机制或文件,具体取决于error_log配置指令的设置。这是默认选项。
  2.   
  3. 通过电子邮件发送到目标参数中的地址。这是唯一使用第四个参数extra_headers的消息类型。
  4.   
  5. 附加到文件目的地。换行符不会自动添加到消息字符串的末尾。
  6.   

编辑:markdown是否有下划线的noparse标签?

答案 1 :(得分:5)

我非常喜欢log4php进行日志记录,即使它还没有离开孵化器。我几乎可以使用log4net,并且发现这种风格对我很自然。

关于系统崩溃,您可以将错误记录到多个目的地(例如,具有阈值为CRITICAL或ERROR的追加器,只有在出现问题时才会发挥作用)。我不确定现有appender的故障安全性如何 - 如果数据库关闭,那个appender是如何失败的? - 但是你可以很容易地编写自己的appender,如果它无法登录就会优雅地失败。

答案 2 :(得分:3)

  
    

简单地将它们写入文件将没有用,是吗?

  

但当然是 - 这是一件好事,比在屏幕上显示要好得多。您希望向用户显示一个漂亮的屏幕,上面写着“抱歉,我们已经蠢蠢欲动。工程师已收到通知。请回去再试一次”并且绝对没有技术细节,因为这样做会带来安全风险。您可以将电子邮件发送到共享邮箱,并将该例外记录到文件或数据库中以供日后查看。这将是一种最佳实践。

答案 3 :(得分:1)

我将它们写入文件 - 并且可能设置监视系统以检查文件大小或上次修改日期的更改。 Webmin是一种简单的方法,但有更完整的软件解决方案。

如果您知道它是一次性错误,那么通过电子邮件发送通知就可以了。但是,如果每分钟有多次点击,请不要通过电子邮件发送通知。我看到一个网站因为每分钟生成数百封电子邮件而导致系统无法连接到数据库。事实上它的LoadAvg也是> 200因为每个新邮件都运行邮件服务器,所以根本没有帮助。在那种情况下 - 最好的方案是,远远地,监视器检查文件大小并连接到外部服务以发送SMS(可能是IM),或者让外部系统在网页上查找错误消息(不必在屏幕上可见 - 它可以在HTML注释中。)

答案 4 :(得分:0)

我认为这很大程度上取决于您的错误发生的地方。如果数据库关闭,则将其记录到数据库并不是一个好主意;)

我使用syslog()函数来记录错误,但是当我在没有syslog支持的系统上时,将它写入文件没有问题。您可以使用例如logwatchthe standard syslogd轻松设置系统以向您发送电子邮件或jabber消息。

答案 5 :(得分:0)

我是第二个log4php。我通常将它配置为向ERROR或CRITITCAL发送异常等内容并将它们写入syslog。从那里,您可以将您的系统日志源添加到ZenossNagiosSplunk或syslog可以与之交谈的任何其他内容。

答案 6 :(得分:0)

您还可以使用Google表单捕获并记录PHP异常。有一个教程here可以解释这个过程。