所以我试图创建一个允许动态记录调试消息的方法,并且我想在消息发生时包含文件名和行号。我的第一个倾向是将debug_backtrace()作为logging方法的参数之一,该方法返回一个包含当前文件名和行号的数组。
问题是,这只给出了第一个文件(index.php)的文件和行。 index.php只是一个五行文件,它从一个包含文件中的类调用一个方法,所以行和文件信息总是说(index.php,第5行),无论什么都没用。
无论您在代码中的哪个位置,有没有办法获取当前行和文件?
加成
这是文件和行信息:
[2011-01-23 06:26:10]资料: “请求不存在 控制器(测试)。“,文件: “/home/spotless/public_html/mymvc/index.php” 行:5,请求:“/ test”
这是index.php的全部内容:
<?php
include_once('application/init.php');
lev_init::init();
?>
这是在init.php文件中使用debug_backtrace()的日志记录调用(第37行):
// if requested controller does not exist, log
lev_logging::message('Request made for non-existant controller ('.$requested_controller.').', debug_backtrace());
第二次更新
debug_backtrace的var_dump
array(1){[0] =&gt; array(6){[“file”] =&gt; 串(42) “/home/spotless/public_html/mymvc/index.php” [ “线”] =&GT; int(5)[“function”] =&gt; string(4)“init”[“class”] =&gt;串(8) “lev_init”[“type”] =&gt; string(2)“::” [ “ARGS”] =&GT; array(0){}}}
答案 0 :(得分:2)
如果您处于全局环境中而不是函数,那么您显示的是正常行为。包含文件不反映在调用堆栈中 - 只调用函数和方法。
据我所知,没有办法建立一个“包含跟踪”,嵌套列表中包含一行代码。这已被反复询问SO和IIRC,从未找到解决方案
答案 1 :(得分:1)
debug_backtrace
会返回一个数组,因此请执行var_export(debug_backtrace(), true)
即:
// if requested controller does not exist, log
lev_logging::message('Request made for non-existant controller ('.$requested_controller.').', var_export(debug_backtrace(), true));
注意:
只需编辑堆栈跟踪的内容/位置。
<?php
// filename: /tmp/a.php
function b_test($foo)
{
var_dump(debug_backtrace());
}
function a_test($str)
{
echo "\nHi: $str";
b_test('bar');
var_dump(debug_backtrace());
}
a_test('friend');
?>
<?php
// filename: /tmp/b.php
include_once '/tmp/a.php';
&GT;
b_test中的debug_backtrace将显示包含的所有内容。 a_test中的那个不会显示b_test调用,因为它已经返回...