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