好吧,我不知道那是不是我想要的。但这是我的问题:
如果出现某些错误,我会在文件中记录FILE,CLASS,FUNCTION和LINE。为此我做了类似的事情:
myLog('['. __FILE__ . ']' . '[' . __CLASS__ . ']' . '[' . __FUNCTION__ . ']' . '[' . __LINE__ . ']');
问题无处不在我要在参数中重复该代码。如果我想改变格式,我会在任何地方改变。
我怎么能有类似的东西:
myLog(LOG_MSG_FORMAT);
使用PHP定义它是不可能的,因为它将给出我定义所在位置的LINE编号,而不是定义的使用位置。
欢迎任何解决方案。我对于具有#def的C语言功能并不感到愚蠢。
修改 仅在出错时才会调用该函数。只是我想在我调用该函数的任何地方记录文件,行等。 因此,如果我只是将代码粘贴到某个地方,那么它应该记录行等等。
例如:
<?php
...
...
<log this location>
...
...
<log this location>
答案 0 :(得分:2)
答案 1 :(得分:1)
PHP没有像C这样的预处理器。但你可以use your own error handler并使用已经提到的debug_backtrace
来获取所需的信息。
答案 2 :(得分:0)
正如其他人所说,您可以使用debug_backtrace来查找日志功能的调用位置。 debug_backtrace是非常不一致的,因此涉及一些技巧,这是一个例子:
// helper
function e($a, $k, $d = null) {
return isset($a[$k]) ? $a[$k] : $d;
}
function mylog($msg) {
$t0 = e(debug_backtrace(), 0);
$t1 = e(debug_backtrace(), 1);
$header = sprintf("%s:%s (%s:%s)",
e($t1, 'class', 'global'),
e($t1, 'function', 'unknown'),
e($t0, 'file'),
e($t0, 'line'));
$_ = func_get_args();
$s = $header . ': ' . vsprintf(array_shift($_), $_);
echo $s, "\n"; // or error_log
}
作为免费奖励,my_log还接受printf样式的参数列表,例如
my_log("send mail to=%s subject=%s time=%d", $to, $subject, time());