我发现了如何将错误转换为异常,如果它们没有被捕获,我会很好地显示它们,但我不知道如何以有用的方式记录它们。简单地将它们写入文件是没有用的,不是吗?当您还不知道导致异常的原因时,您是否会冒险访问数据库?
7 回答
您可以使用set_error_handler设置自定义异常来记录您的错误。我个人会考虑将它们存储在数据库中,因为默认异常处理程序的回溯可以提供有关导致它的原因的信息 - 但是,如果数据库处理程序触发了异常,这当然是不可能的。
您还可以使用error_log来记录您的错误。它可以选择消息目的地,包括:
引用自error_log
- PHP 的系统记录器,使用操作系统的系统记录机制或文件,取决于 error_log 配置指令设置的内容。这是默认选项。
- 通过电子邮件发送到目标参数中的地址。这是唯一使用第四个参数 extra_headers 的消息类型。
- 附加到文件目标。换行符不会自动添加到消息字符串的末尾。
编辑:markdown 是否有下划线的 noparse 标签?
我真的很喜欢log4php进行日志记录,即使它还没有从孵化器中出来。我几乎在所有事情中都使用 log4net,并且发现这种风格对我来说很自然。
关于系统崩溃,您可以将错误记录到多个目的地(例如,具有阈值为 CRITICAL 或 ERROR 的附加程序,只有在出现问题时才会发挥作用)。我不确定现有的 appender 的故障安全性如何——如果数据库关闭,那个 appender 是如何失败的?——但是你可以很容易地编写自己的 appender,如果它无法记录,它将优雅地失败。
简单地将它们写入文件是没有用的,不是吗?
但当然是——这是一件很棒的事情,比在屏幕上显示它们要好得多。您想向用户显示一个漂亮的屏幕,上面写着“对不起,我们搞砸了。工程师已收到通知。回去再试一次”并且绝对没有技术细节,因为这样做会带来安全风险。您可以向共享邮箱发送电子邮件并将异常记录到文件或数据库以供以后查看。这将是一个最佳实践。
我会将它们写入一个文件 - 并且可能设置一个监视系统来检查文件大小或上次修改日期的更改。Webmin 是一种简单的方法,但还有更完整的软件解决方案。
如果您知道这是一次性错误,则可以通过电子邮件发送通知。但是,对于每分钟点击率很高的网站,永远不要通过电子邮件发送通知。我看到一个网站因为每分钟生成数百封电子邮件而导致系统无法连接到数据库而崩溃。由于邮件服务器正在为每条新消息运行,它的 LoadAvg 也大于 200 的事实根本没有帮助。在那种情况下 - 最好的情况是,到目前为止,看门狗检查文件大小并连接到外部服务以发送 SMS(可能是 IM),或者让外部系统在网页上查看错误消息(其中不必在屏幕上可见 - 它可以在 HTML 注释中)。
我认为这很大程度上取决于您的错误发生的位置。如果数据库向下记录到数据库不是一个好主意;)
我使用syslog()函数来记录错误,但是当我在没有 syslog 支持的系统上时,将它写入文件没有问题。您可以使用例如logwatch或标准 syslogd轻松设置系统以向您发送电子邮件或 jabber 消息。
您还可以使用 Google 表单捕获和记录 PHP 异常。这里有一个教程解释了这个过程。