在日志中显示哪个文件路径和行号


Which file path and line number to show in log?

我已经编写了一个日志库,将条目添加到文件或输出流中。

当条目被添加到日志中时,它还包括上下文信息,例如为添加条目而进行的调用的文件和行号。

我的问题是:我应该使用添加条目的调用的文件路径和行号,还是使用触发事件的调用者来记录消息?

<标题> trigger.php:
<?php
    $do->something(); #line 2
<标题> do.php h1> 在,消息"Did something."被记录为来自do.php第6行。更改日志记录类以说明消息来自trigger.php第2行是不是更好?

编辑

澄清一些事情。

  1. 库在日志条目中包含整个调用堆栈。因此,在功能更丰富的日志类中,你可以看到比上面的例子更多的东西。
  2. 该库确实使用了日志级别,并将过滤掉不需要的级别。上面的例子并没有显示这一点,但是您可以查看库本身来确定。

不幸的是,我不清楚在这个场景中消息是如何表示的。这个非常小的场景将只显示一个文件路径和一行。假设不能更改,将记录哪个文件路径和行号?

谢谢你的帮助!

另外,如果你有三个关卡而不是两个呢?如果你有四个呢?我建议您采用传统的做法,跟踪实际出现log()调用的行。

class client
{
  public function get_some_data()
  {
    $data = $this->get_my_data();
    if (empty($data)) {
      $this->log->add('no data in sight');
    }
    // lots of processing
    if ($something) {
      $this->log->add('data was corrupted');
    }
  }
}
//...
$client->get_some_data();

如果您只记录上层调用,您将只知道它发生在get_some_data()中,而不知道确切的位置。你可能会想"是的,但是我可以使用记录的准确错误找到它",但是当你挖掘日志以查明问题时,这真的不是你想要做的。

如果你对这个函数有几个调用,并且你想要更多关于哪一个记录了该行的信息,你可以做的是在你的日志旁边存储一个最小的堆栈跟踪,参见debug_backtrace()。它可以小到

2011-12-25 17:02:37 ERROR "data was corrupted" at /path/client.php:6 (called from /path/somefile.php:57)

我还强烈建议您添加不同的日志记录级别,因为您在开发/调试情况下需要的日志记录并不是您在生产环境中需要的日志记录。