codeigniter改变Common.php函数

时间:2012-09-24 20:02:31

标签: php class codeigniter logging

我正在尝试自定义codeigniter的日志记录功能。我找到了这个论坛帖子,它描述了我需要的东西: http://codeigniter.com/forums/viewthread/139997/ 但我想在不改变核心文件/类的情况下这样做。

我正在尝试更改log_message函数。我已经扩展了CI_Log类并且运行良好,但现在我正在尝试更改驻留在system / core / Common.php中的log_message()。实际上它不是一个类,所以我不能扩展它,它似乎只是一个有用函数的集合。我尝试重新声明log_message()并将其放在application / core / Common.php中,但这似乎不我有什么想法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

我相信你真正想要改变的功能是write_log(),如果我错了,请纠正我。您可以通过在application\libraries\MY_Log.php中扩展功能来实现此目的。

我的MY_Log.php中有以下脚本,每当发生错误时都会通过电子邮件发送给我:

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

/* Extends the logging class to send an email when an error is triggered */

class MY_Log extends CI_Log {

    function __construct()
    {
        parent::__construct();
    }

    function write_log($level = 'error', $msg, $php_error = FALSE, $additional, $additional2)

    {   
        if ($this->_enabled === FALSE)
        {
        return FALSE;
        }

         $level = strtoupper($level);

        if ( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold))
        {
        return FALSE;
        }

        $filepath = $this->_log_path.'log-'.date('Y-m-d').'.php';
        $message  = '';

        if ( ! file_exists($filepath))
        {
        $message .= "<"."?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?".">\n\n";
        }

        if ( ! $fp = @fopen($filepath, FOPEN_WRITE_CREATE))
        {
        return FALSE;
        }

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

        flock($fp, LOCK_EX);
        fwrite($fp, $message);
        flock($fp, LOCK_UN);
        fclose($fp);

        @chmod($filepath, FILE_WRITE_MODE);
        return TRUE;
    }

}

如果您不想扩展写入功能,则需要扩展其他一个日志功能。

答案 1 :(得分:0)

辅助功能可以在这里工作。您必须使用它而不是log_message()。

这就是我的所作所为:

在application / helpers我创建了'new_log_helper.php'(帮助者必须以_helper.php结尾) 我希望这可以将日志条目添加到数据库中并按进程跟踪(这样我知道在代码中查找的位置)。

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * Custom Logging Interface
 *
 * Add log entries to a log table on the db and track process name
 *
 * @access  public
 * @return  void
 */
if ( ! function_exists('new_log')) {
    function new_log($level = 'error', $message, $process, $php_error = FALSE)
    {
        if (config_item('log_threshold') == 0) {
            return;
        }

        $CI =& get_instance();
        $CI->load->model('new_log','logger', TRUE);
        $CI->logger->add_event($process, $level, $message);

        log_message($level, $process.': '.$message, $php_error);
    }
}

然后当你需要它时,使用它:

$this->load->helper('new_log');
...
new_log('debug','Something happened','Stack overflow answer');

无论如何,我知道你的问题是在几年前,但我看起来也许其他人也是。