1

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

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

4

2 回答 2

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;
    }

}

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

于 2012-09-24T20:46:14.260 回答
0

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

这是我所做的:

在应用程序/帮助程序中,我创建了“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');

无论如何,我知道你的问题是几年前的,但我一直在寻找,所以也许其他人也是。

于 2014-11-27T02:23:11.947 回答