如何在PHP中记录未捕获的异常?
我已经发现如何将错误转换为异常,如果它们没有被捕获,我会很好地显示它们,但我不知道如何以有用的方式记录它们。简单地将它们写入文件将不会有用,是吗?如果你不知道是什么导致了异常,你会冒险访问一个数据库吗?如何在PHP中记录未捕获的异常?
我真的很喜欢log4php伐木,尽管它还没有离开孵化器。我在几乎所有方面都使用log4net,并且发现这种风格对我来说很自然。
关于系统崩溃,您可以将错误记录到多个目的地(例如,拥有阈值为CRITICAL或ERROR的appender,只有在事情出错时才会发挥作用)。我不确定现有的appender是如何失效保护的 - 如果数据库关闭了,appender是如何失败的 - 但是你可以很容易地编写你自己的appender,如果它无法记录,它将会优雅地失败。
您可以使用set_error_handler设置自定义异常来记录您的错误。我个人会考虑将它们存储在数据库中,因为默认的异常处理程序的回溯可以提供关于是什么导致它的信息 - 但是,如果数据库处理程序触发异常,这当然是不可能的。
您还可以使用error_log来记录您的错误。它有消息目的地,其中包括可供选择:
- PHP的系统日志引用,使用操作系统的系统日志记录机制或文件,这取决于什么的error_log配置指令设置为。这是默认选项。
- 通过电子邮件发送到目标参数中的地址。这是使用第四个参数extra_headers的唯一消息类型。
- 附加到文件目标。换行符不会自动添加到消息字符串的末尾。
编辑:降价是否有下划线noparse标签?
只要将它们写入文件将不会有用,是吗?
但是,当然,这是 - 这是做的,要比在屏幕上显示他们更好的一个伟大的事情。你想向用户展示一个不错的屏幕,其中显示“抱歉,我们搞错了,工程师已经收到通知,回去再试一次”,绝对没有技术细节,因为这样做会带来安全风险。您可以将电子邮件发送到共享邮箱,并将该异常记录到文件或数据库以供日后查看。这将是一个最佳做法。
我认为这取决于你的错误发生的地方。如果数据库向下记录到数据库不是好主意;)
我使用syslog()函数记录错误,但我没有问题将它写入文件当我在一个没有系统日志支持。您可以使用例如logwatch或the standard syslogd轻松设置系统以向您发送电子邮件或jabber消息。
我会将它们写入一个文件 - 也许会设置一个监视系统来检查文件大小或上次修改日期的更改。 Webmin是一种简单的方法,但有更完整的软件解决方案。
如果您知道它的一次性错误,那么通过电子邮件发送通知就可以。但是,每分钟点击次数多的网站,请不要永远通过电子邮件发送。我看到一个网站因为每分钟生成数百封电子邮件而导致系统无法连接到数据库。由于每个新邮件都运行邮件服务器,它的LoadAvg> 200,这一事实根本没有任何帮助。在这种情况下 - 最好的情况是,看门狗通过检查文件大小并连接到外部服务来发送SMS(可能是IM),或让外部系统在网页上查看错误消息(其中不必在屏幕上可见 - 它可以在HTML注释中)。
log4php具有很好的功能,但对我来说,它的工作非常缓慢! – JohnM2 2011-01-10 09:50:00
现在它已经离开孵化器,并且URL已经更改为http://logging.apache.org/log4php/ – Mike 2011-08-24 20:47:44