【问题标题】:Problems tracing file and line for debug logging (PHP)跟踪调试日志记录的文件和行的问题 (PHP)
【发布时间】:2011-01-24 00:20:24
【问题描述】:

所以我正在尝试创建一种允许即时记录调试消息的方法,并且我想包括出现消息的文件名和行号。我的第一个倾向是将 debug_backtrace() 作为记录方法的参数之一,它返回一个包含当前文件名和行号的数组。

问题是,这只给出了第一个文件(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 文件(第 37 行)中使用 debug_backtrace() 的日志记录调用:

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

第二次更新

debug_backtrace 的var_dump

数组(1) { [0]=> 数组(6) { ["文件"]=> 字符串(42) “/home/spotless/public_html/mymvc/index.php” ["行"]=> int(5) ["函数"]=> 字符串(4)“初始化”[“类”]=>字符串(8) “lev_init” [“类型”]=> 字符串(2)“::” ["args"]=> 数组(0) { } } }

【问题讨论】:

  • 不应该的。回溯应该包含完整的信息。你知道它是一个数组吗?你能展示一个示例回溯吗?
  • @dqhendricks:你确定文档显示它显示了每个函数调用的当前行和文件......
  • 根据您的描述,这需要__FILE____LINE__ 常量。
  • @Pekka @RageZ @mario 添加了其他信息。 mario,我不希望这个调用有两个参数而不是一个,另外我可能会在某些时候利用跟踪数组中的其他元素。
  • 在数组上做一个print_r(),里面应该有更多的信息

标签: php debugging backtrace


【解决方案1】:

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

据我所知,没有办法构建“包含跟踪”,嵌套包含一行代码的列表在其中。这已在 SO 和 IIRC 上反复询问,从未找到解决方案.

【讨论】:

  • 这是否意味着如果我从日志记录函数中调用 debug_backtrace,它会得到调用日志记录函数的行?
  • @dqhendricks 是的,只有那一行(如果它在全局上下文中)。
  • 我在函数中完成了它,它给了我正确的文件和行。这是完美的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2013-11-13
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    相关资源
    最近更新 更多