是否可以在警告上记录堆栈跟踪?
以下是我记录所有警告和通知错误的方法
function boot_error_handler($errno, $errstr, $errfile, $errline){
switch($errno){
case E_WARNING:
case E_PARSE:
case E_NOTICE:
$message = "$errstr $errfile:$errline";
if(class_exists('Log')){
Log::write($message, 'warning', true);
}
if(ENV != ENV_PROD){
echo $message;
}
break;
}
}
set_error_handler('boot_error_handler');
答案 0 :(得分:2)
您可以在错误处理程序中使用debug_backtrace()
函数来获取当前堆栈跟踪。问题是它返回关联数组的数组,如果你只需要记录它就会感到不舒服,因为你需要从它生成一个人类可读的字符串。
另一种解决方案是创建Exception
实例并使用其方法getTraceAsString()
。
$exception = new \Exception();
$trace = $exception->getTraceAsString();
所以基本上它取决于默认的exsceptions stacktrace格式是否足够你或者你想要soem自定义格式。
答案 1 :(得分:1)
import httplib
import urllib
params = urllib.urlencode({'gws_rd': 'ssl', 'q': 'hello'}) # search for hello
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
c = httplib.HTTPSConnection("google.com")
c.request("GET", "/", params, headers)
response = c.getresponse()
print response.status, response.reason
data = response.read()
file_ = open('result.html', 'w')
file_.write(data)
file_.close()
是一种生成格式良好的跟踪(PHP 5.4 +)的简便方法
它只会返回一个字符串,因此您可以根据需要用它替换或扩展现有的日志消息。
答案 2 :(得分:1)
使用debug_backtrace()或触发异常,捕获它并使用getTraceAsString()获取它的跟踪:
try {
throw new Exception();
} catch (Exception $e) {
$e->getTraceAsString();
}