2009-11-25 95 views
1

记录用户遇到的错误的最佳方式是什么?PHP - 记录错误

我最初的想法是创建一个函数,该函数用一个唯一的数字记录错误,并且可能将变量转储到数据库中的记录中。

有没有更好的方法?我应该使用文本文件日志吗?

回答

0

嗯,至少写文本在本地系统上的文件应该是不易出错,从而使你能够捕捉DB错误太:)

我宁愿当前状态的一个体面的自卸写入简单的日志文件。除了你的“自己”状态(即你的应用程序的变量和对象)之外,你可能会考虑做一个phpinfo()以获得有关包含哪些环境和请求变量的灵感。

4

如何覆盖默认的PHP错误处理程序? 这个网站应该提供一些基本信息:http://www.php.net/manual/en/function.set-error-handler.phphttp://www.php.net/manual/en/function.set-exception-handler.php

您也可能希望存储数据库错误,也许是某种自定义的功能,使您可以使用类似的代码的第一个注释:

<?php 
$objQueryResult = mysql_query("query here") or some_kind_of_function_here(); 
?> 

您可能希望将记录的错误存储在公共html根文件夹之外的文件中,以确保人们无法意外访问它。 我也假设你想在这样的文件中存储一个完整的堆栈跟踪,因为那样你实际上可以调试这个问题。 当覆盖默认错误处理程序时,请注意您不要忘记向用户发送一条好消息(并在需要时退出脚本)。

我会建议存储:

  • $ _ POST
  • $ _GET
  • 完整的转储 debug_print_backtrace的()
  • 将可能触发这个SQL?

我建议您使用debug_print_backtrace()来确保您获得数据摘要。 debug_backtrace()函数提供了相同的信息,但它有时会给你太多的信息。 你可以用它来赶上回溯代码:

<?php 
ob_start(); 
debug_print_backtrace(); 
$trace = ob_get_contents(); 
ob_end_clean(); 
?> 

要保存这一点,你可以使用一个纯文本输出,如果你没有得到太多的错误,否则可能使用类似的SQLite? - 只要不使用相同的SQL连接来存储错误,如果你的网络服务器发生SQL连接错误,可能会引发更多问题。

+0

+1。关于'mysql_query(...)或...',你可能会考虑编写一个自定义的'db_query(...)',它本身可以处理错误捕获和日志记录。这样,您也可以记录失败的SQL。 – jensgram 2009-11-25 09:21:57

0

PEAR :: Log对于这种记录很方便。例如

 
$logger->alert("your message"); 
$logger->warning("your message"); 
$logger->notice("your message"); 

您可以登录到一个文件或数据库,我写了一个PDO启用sqlite的延伸,非常简单。

这些都很方便地放入异常处理代码中。

PEAR::Log

记录:ID,logTime Description该条,身份,严重性1-7(即 “警报”),和您的邮件。

0

我认为@ Icheb的答案涵盖了所有。

我今年在一个我认为我会分享的项目中尝试了一些新的东西。

对于基于PHP的内容聚合/分发服务,在一些服务器上后台安静地运行并且您容易忘记的应用程序,我们需要一个错误报告系统来确保我们发现错误。

每出现一个错误具有在代码中指定的错误ID:

$success = mysql_query(this_and_that); 
if (!$success) log_error ("Failed Query: ".mysql_error(), "MYSQL_123"); 

错误得到一个完整的回溯记录在一个文件,但更重要的是通过邮件发送给管理员,一起变量转储。

为避免邮件泛滥 - 该服务在一天中有成千上万的用户 - 错误邮件每发送一个错误代码,每发送一个错误邮件只发送一次。在该时间范围内发生两次相同代码的错误时,不会发送额外的邮件。这意味着每种错误都会被记录下来,但是当数百或数千用户发生错误时,您不会被错误消息所杀。

这很容易实现;艺术正在获得错误ID。例如,您可以在系统中为每个失败的mySQL查询提供相同的通用“MYSQL”错误ID。在大多数情况下,这将是太通用,并阻止太多。如果你给每个mySQL查询一个唯一的错误ID,你可能会流入邮件并且过滤效果消失。但是当智能分组时,这可能是一个非常好的设置。

0

从可用性的角度来看,用户不应该经历过错误。 根据错误,你应该做出不同的策略:

  • 不开捕错误或难以从PHP来抓,阅读日志为每个应用程序
    • 阿帕奇
    • MySQL和数据库错误,交易
    • 准备PHP与“网站正在更新”或错误控制器的紧急情况。
  • PHP错误
    • 这些都应该通过例外被检测
    • 沉默,但没有被遗忘,不要试图去解决这些问题的飞行
    • 记录它们,并把它们
  • 接口错误
    • 建议:允许用户下载它建议或错误

我知道这个简化版,全覆盖,只是增编其他建议。