#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";
[...]
Я надеюсь, что это может помочь другим ! 🙂