繁体   English   中英

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

[英]How do I log uncaught exceptions in PHP?

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

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

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

引自error_log

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

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

我非常喜欢使用log4php进行日志记录,即使它尚未进入孵化器。 我几乎可以使用log4net,并且发现这种风格对我来说非常自然。

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM