向Codeigniter日志添加详细信息

时间:2014-09-23 13:52:47

标签: php codeigniter logging

我对在Codeigniter的日志文件中调试感兴趣的所有错误都报告它们来自/system/core/Loader.php。例如,这是一行:

ERROR | 2014-09-22 22:35:43 | "Severity: Notice  --> Undefined variable: my_variable \/system\/core\/Loader.php(829) : eval()'d code 84"

我知道这是来自哪个文件,这是一个观点。我知道debug_backtrace并且我正在考虑创建一个字符串并将其连接到被覆盖的$msg中的Log.php变量的末尾,但我首先想要检查与你所有朋友的两件事:

  1. debug_backtrace是最好的方法吗?它返回大量数据。
  2. 是否有人知道有人已经这样做了?对使用Codeigniter的任何人来说似乎都是显而易见的(...仍然;)

1 个答案:

答案 0 :(得分:0)

以下是您可以根据需要调整的一些代码(我建议创建一个My_Log而不是编辑系统文件,以防CI确实得到更新)。我有这个的原因很复杂,不再有用,但它可能会给你一个开始:

protected function log_query ($query, $type)
{
    $backtrace = debug_backtrace ();
    $backtrace = array_slice ( $backtrace, 2, -2 ); // first and last two elements are things that never change

    $traced    = array ();

    foreach ( $backtrace as $bt )
    {

        $func   = isset ( $bt['function'] ) ? $bt['function'].'()' : '';
        $line   = isset ( $bt['line'] )     ? $bt['line']          : '';
        $file   = isset ( $bt['file'] )     ? str_replace ( APP, '', $bt['file'] ) : '';
        $object = isset ( $bt['object'] )   ? get_class ( $bt['object'] ) : '';
        $args   = array (); build_args ( $bt['args'], $args );
        $args   = implode ( '; ', $args );

        if ( $object )
        {
            $obj_func = $object . '->' . $func;
        } else {
            $obj_func = $func;
        }

        $traced[] = "$file $obj_func $line $args";
        unset($args);
    }

    $traced = implode ( "\n\t", $traced );

    $date = MYSQL_DATE_TIME;
    $uri  = isset ( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '' ;
    $query= preg_replace ( "/[\n\t]/", ' ', $query );

    log_message ('error', "{$query}\n\n\t{$date} ({$type})\n\t{$uri}\n\t{$traced}\n--------------------------\n");
}