【发布时间】:2009-11-25 08:53:05
【问题描述】:
记录用户经历的错误的最佳方式是什么?
我最初的想法是创建一个函数,用唯一的编号记录错误,并可能将变量转储到数据库的记录中。
有没有更好的方法?我应该改用文本文件日志吗?
【问题讨论】:
标签: php logging error-handling
记录用户经历的错误的最佳方式是什么?
我最初的想法是创建一个函数,用唯一的编号记录错误,并可能将变量转储到数据库的记录中。
有没有更好的方法?我应该改用文本文件日志吗?
【问题讨论】:
标签: php logging error-handling
如何覆盖默认的 PHP 错误处理程序? 这个网站应该给出一些基本信息:http://www.php.net/manual/en/function.set-error-handler.php和http://www.php.net/manual/en/function.set-exception-handler.php的第一条评论
您可能还想存储数据库错误,也许是某种允许您使用如下代码的自定义函数:
<?php
$objQueryResult = mysql_query("query here") or some_kind_of_function_here();
?>
您可能希望将记录的错误存储在公共 html 根文件夹之外的文件中,以确保人们不会意外访问它。 我还假设,您希望将完整的堆栈跟踪存储在这样的文件中,因为这样您就可以实际调试问题。 覆盖默认错误处理程序时,请注意不要忘记向用户发送一条好消息(并在需要时退出脚本)。
我建议存储:
我建议您使用 debug_print_backtrace() 来确保您获得数据摘要。 debug_backtrace() 函数提供了大致相同的信息,但它有时会提供太多信息。 可用于捕获回溯的代码:
<?php
ob_start();
debug_print_backtrace();
$trace = ob_get_contents();
ob_end_clean();
?>
要存储这个,你可以使用纯文本输出,如果你没有得到太多错误,否则可能使用 sqlite 之类的东西? - 只是不要使用相同的 SQL 连接来存储错误,因为如果您遇到网络服务器到 SQL 连接错误,这可能会引发更多问题。
【讨论】:
mysql_query(...) or ...,您可以考虑编写一个自定义的db_query(...),它本身可以处理错误捕获和记录。这样,您也可以记录失败的 SQL。
好吧,至少在本地系统上写入文本文件应该不太容易出错,因此您也可以捕获 DB 错误:)
我更愿意将当前状态的体面转储写入一个简单的日志文件。除了您的“自己的”状态(即您的应用程序的变量和对象)之外,您还可以考虑发送phpinfo() 以获取有关要包含哪些环境和请求变量的灵感。
【讨论】:
PEAR::Log 对于这种日志记录很方便。例如
$logger->alert("你的消息"); $logger->warning("你的消息"); $logger->notice("你的消息");等等
你可以登录到文件或数据库,我写了一个启用 PDO 的 sqlite 扩展,非常简单。
这些也很方便放入异常处理代码中。
记录:id、logtime、身份、严重性 1-7(即“警报”)和您的消息。
【讨论】:
我认为@Icheb 的回答涵盖了所有内容。
今年我在一个我认为我会分享的项目中尝试了一些新的东西。
对于基于 PHP 的内容聚合/分发服务,即在某些服务器上安静地在后台运行并且您容易忘记的应用程序,我们需要一个错误报告系统来确保我们注意到错误。
发生的每个错误都有一个在代码中指定的错误 ID:
$success = mysql_query(this_and_that);
if (!$success) log_error ("Failed Query: ".mysql_error(), "MYSQL_123");
错误被记录在一个文件中,但更重要的是通过邮件发送给管理员,连同完整的回溯和变量转储。
为了避免邮件泛滥 - 该服务在美好的一天拥有成千上万的用户 - 每个错误代码仅每 x 小时发送一次错误邮件。如果在该时间段内出现两次相同代码的错误,则不会发送额外的邮件。这意味着每一种错误都会被记录下来,但是当它发生在成百上千的用户身上时,你不会被错误消息杀死。
这很容易实现;艺术使错误ID正确。例如,您可以为系统中每个失败的 mySQL 查询提供相同的通用“MYSQL”错误 ID。在大多数情况下,这将过于笼统并且阻塞太多。如果你给每个 mySQL 查询一个唯一的错误 ID,你可能会被邮件淹没,过滤效果就消失了。但是当智能分组时,这可能是一个非常好的设置。
【讨论】:
从可用性的角度来看,用户不应该遇到错误。 根据错误,您应该制定不同的策略:
我知道这并没有涵盖所有内容,只是其他人建议的补充。
【讨论】: