Как зарегистрировать информацию о вызывающем классе?

#php #codeigniter #logging

#php #codeigniter #протоколирование

Вопрос:

Я хотел бы переопределить класс CI_Log, чтобы улучшить строки журнала. Я хочу зарегистрировать имя вызывающего класса и метод. Пример :

 DEBUG - 2011-04-23 09:21:29 - MY_Class - method --> Router Class Initialized
  

Я попытался переопределить метод write_log следующим образом :

 <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Log extends CI_Log {

    public function write_log($level = 'error', $msg, $php_error = FALSE)
    {
        [...]

        $message .= 
            $level .
            (($level == 'INFO') ? '  - ' : ' - ') .
            $this->router->fetch_class() .
            ' - ' .
            $this->router->fetch_method() .
            ' - ' .
            date($this->_date_fmt). ' --> ' .
            $msg .
            "n";

        [...]
    }

}
  

Но это не работает, $this->router недоступен.
Не могли бы вы мне помочь?

Комментарии:

1. Конечно, $this->router будет работать только для контроллеров, так что это не очень хорошая идея. Я бы хотел, чтобы это работало для моделей и так далее…

Ответ №1:

Вы можете использовать где-нибудь в своем методе:

//$RTR доступен с system/core/CodeIgniter.php 
глобальный $RTR;
$router_class = $RTR->fetch_class();
$rotuer_method = $RTR->fetch_method();

Комментарии:

1. Спасибо за ваш ответ. Поскольку класс Log инициализируется перед классом Router, мне пришлось использовать этот синтаксис: $router_class = ''; $router_method = ''; //$RTR is available from system/core/CodeIgniter.php global $RTR; if ( isset($RTR)) { $router_class = $RTR->fetch_class(); $router_method = $RTR->fetch_method(); } Но это работает только для текущего контроллера…

2. Я объясняю: я хотел бы, чтобы при вызове контроллера / модели / чего угодно, кто log_message('debug', 'blabla'); это генерирует следующую строку DEBUG - 2011-04-23 09:21:29 - Class - method --> Router Class Initialized

Ответ №2:

Хорошо, я думаю, я понял. Вот мой код :

     [...]

    $message .= $level.(($level == 'INFO') ? '  - ' : ' - ') . date($this->_date_fmt);

    $stack = debug_backtrace();
    // We are searching for the 2nd element of the $stack array beacause :
    // - $stack[0] is always taken by JG_Log->write_log()
    // - $stack[1] is always taken by log_message()
    if (isset($stack[2]['class'])) {
        $message .= ' - ' . $stack[2]['class'] . ' - ' . $stack[2]['function'];
    }

    $message .= ' --> '.$msg."n";

    [...]
  

Я надеюсь, что это может помочь другим ! 🙂