如何让PHP在致命错误上记录堆栈跟踪

时间:2011-03-18 09:24:08

标签: php

我已经配置了php来记录错误,在我的开发机器上,它们显示在apache错误日志中:

[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP Parse error:  syntax error, unexpected ')' in /Users/troelskn/Projects/test/bootstrap.inc.php on line 27
[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP Stack trace:
[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP   1. {main}() /Users/troelskn/Projects/test/public/index.php:0

但是,在生产计算机(Ubuntu)上,错误后没有堆栈跟踪,并且邮件附加了一个引用者。例如。它看起来像是:

[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP Parse error:  syntax error, unexpected ')' in /Users/troelskn/Projects/test/bootstrap.inc.php on line 27, referer: http://localhost/

如何控制此格式?我非常希望在日志中提供堆栈跟踪。

2 个答案:

答案 0 :(得分:17)

嗯,正如已经指出的那样,你没有在现场机器上获得相同的格式,因为实时机器没有安装xdebug。有debug_backtrace但不会发现致命错误。

您可以在实时服务器上安装xdebug,但是您必须非常小心地将其配置为不显示除堆栈跟踪日志记录之外的任何功能。在活动框中谨慎使用xdebug可能会带来安全风险,因为人们可能会启动远程调试会话,或者其增强的错误消息可能会无意中回显代码的内部细节。

说实话?我认为您最好的选择是尝试重新创建测试服务器上发生的实时服务器记录错误的情况。

编辑添加 :忘记提及除了存在安全风险外,xDebug还会对您网站的效果产生负面影响。它以几种关键方式挂钩Zend引擎来记录程序状态并改变其行为(例如覆盖@错误抑制),这将对性能产生不可避免的影响。在测试环境中尝试复制问题基本上比将调试工具添加到实时环境要好得多。

答案 1 :(得分:2)

您可以使用debug_backtracedebug_print_backtrace进行追踪,但我从未使用过它们。最佳跟踪来自xdebugZend debugger。我同意Gordon的意见,你不应该在生产机器上安装调试器。