2011-01-24 101 views
0

问题所以我想做一个方法,允许即时记录调试消息,并且我想包括消息发生的文件名和行号。我的第一个倾向是给debug_backtrace()作为日志方法的参数之一,它返回一个包含当前文件名和行号的数组。跟踪文件和线的调试日志记录(PHP)

问题是,这只给出了第一个文件(index.php)的文件和行。 index.php只是一个五行文件,它在一个包含文件中调用一个类的方法,所以行和文件信息总是说(index.php,第5行),不管它是什么也没用。

有没有办法获得当前的行和文件,无论您在代码中的哪个位置?

加成

这里是文件和行信息:

[2011-01-23 6点26分10秒]的资料: “请求不存在的 控制器做出(试验)“,文件: ”/home/spotless/public_html/mymvc/index.php“, 行:5,请求: ”/测试“

ħ ERE是以其整体在index.php:

<?php 

    include_once('application/init.php'); 
    lev_init::init(); 
?> 

下面是使用debug_backtrace()日志记录呼叫时,文件的init.php内(线37):

// if requested controller does not exist, log 
lev_logging::message('Request made for non-existant controller ('.$requested_controller.').', debug_backtrace()); 

第二更新

debug_backtrace

阵列(1){[0] =>数组(6){[“文件的的var_dump “] => string(42) ”/home/spotless/public_html/mymvc/index.php“ [”line“] => int(5)[”function“] => string(4)”init “[”class“] => string(8) ”lev_init“[”type“] => string(2)”::“ [”args“] => array(0){}}}

+1

这不应该。回溯应该包含完整的信息。你知道这是一个数组吗?你能举一个例子回溯吗? – 2011-01-24 00:22:28

+0

@dqhendricks:你确定文档显示它显示每个函数调用的当前行和文件.... – RageZ 2011-01-24 00:23:14

回答

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'; 

?>

在b_test的debug_backtrace将显示一切到包括。 a_test中的那个将不会显示b_test调用,因为它已经返回...

2

如果您在全局上下文中使用此函数,而不是函数,那么您显示的是正常行为。包含文件而不是反映在调用堆栈中 - 仅调用函数和方法。

据我所知,没有办法建立一个“包含踪迹”,一个包含一行代码的嵌套列表。这已被反复询问SO和IIRC,解决方案从未找到。