PHP - 记录错误

时间:2009-11-25 08:53:06

标签: php logging error-handling

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

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

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

5 个答案:

答案 0 :(得分:4)

如何覆盖默认的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根文件夹之外的文件中,以确保人们无法偶然访问它。 我还假设,您希望在这样的文件中存储完整的堆栈跟踪,因为这样您就可以实际调试问题。 覆盖默认错误处理程序时,请注意您不要忘记向用户发送一条好消息(并在需要时退出脚本)。

我建议存储:

  • $ _ 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连接错误,这可能会引发更多问题。

答案 1 :(得分:0)

好吧,至少写入本地系统上的文本文件应该不易出错,因此也可以捕获数据库错误:)

我更愿意将当前状态的合适转储写入简单的日志文件。除了“自己的”状态(即应用程序的变量和对象)之外,您可以考虑使用phpinfo()来获取要包含的环境和请求变量的灵感。

答案 2 :(得分:0)

PEAR :: Log对于这种日志记录很方便。 e.g。

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

你可以登录到文件或数据库,我写了一个支持PDO的sqlite扩展,非常简单。

这些也可以放入异常处理代码中。

PEAR::Log

记录:id,logtime,身份,严重性1-7(即“警报”)和您的消息。

答案 3 :(得分:0)

我认为@ 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,您可能会收到邮件,并且过滤效果消失了。但是,当智能分组时,这可能是一个非常好的设置。

答案 4 :(得分:0)

从可用性的角度来看,用户不应该遇到错误。 根据错误,您应该制定不同的策略:

  • 非捕获错误或难以从PHP捕获,请阅读每个应用程序的日志
    • 的Apache
    • MySQL和数据库错误,交易
    • 准备带有“正在更新的网站”的php或紧急情况下的错误控制器。
  • PHP错误
    • 应通过例外
    • 检测这些内容
    • 沉默但没有忘记,不要试图动态修复它们
    • 记录并对待它们
  • 界面错误
    • 建议:允许用户提交建议或错误

我知道这并不涵盖所有人,只是其他人建议的附录。