我正在尝试自定义codeigniter的日志记录功能。我找到了这个论坛帖子,它描述了我需要的东西: http://codeigniter.com/forums/viewthread/139997/ 但我想在不改变核心文件/类的情况下这样做。
我正在尝试更改log_message函数。我已经扩展了CI_Log类并且运行良好,但现在我正在尝试更改驻留在system / core / Common.php中的log_message()。实际上它不是一个类,所以我不能扩展它,它似乎只是一个有用函数的集合。我尝试重新声明log_message()并将其放在application / core / Common.php中,但这似乎不我有什么想法可以解决这个问题吗?
答案 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');
无论如何,我知道你的问题是在几年前,但我看起来也许其他人也是。