跟踪调试日志记录的文件和行的问题(PHP)

时间:2011-01-24 00:20:25

标签: php debugging backtrace

所以我试图创建一个允许动态记录调试消息的方法,并且我想在消息发生时包含文件名和行号。我的第一个倾向是将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){}}}

2 个答案:

答案 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调用,因为它已经返回...