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

}

書き込み関数を拡張する予定がない場合は、他のログ関数の1つを拡張する必要があります。

于 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 に答える