2011-01-24 97 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,解決方案從未找到。