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

时间:2011-12-07 00:27:53

标签: php

我写了一个logging library,它会在文件或输出流中添加条目。

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

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

trigger.php:

<?php

    $do->something(); #line 2

do.php

<?php

    class Do
    {
        public function something ()
        {
            $this->log->add('Did something.', E_USER_NOTICE); # line 6
        }
    }

现在,消息“做了什么。”记录为来自do.php第6行。是否更好地更改日志记录类以说明消息来自trigger.php第2行?

修改

澄清一些事情。

  1. 该库包含日志条目中的整个调用堆栈。因此,在功能更丰富的日志记录类中,您可以看到比上面的示例更多的内容。
  2. 该库确实利用了日志记录级别,并将过滤掉不需要的级别。上面的示例没有显示,但您可以查看库本身以确定。
  3. 不幸的是,我不清楚这个场景中的消息是如何表示的。这个非常小的场景只显示一个文件路径和一行。 假设无法更改,将记录哪个文件路径和行号?

    感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

另外,如果你有三个级别而不是两个级别怎么办?如果你有四个怎么办?我建议你采用传统的方法来跟踪实际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)

我还强烈建议您添加不同的日志记录级别,因为您在dev / debug情况下所需的日志记录不是您在生产中所需的日志记录。