bomb_2002 发表于 2013-6-6 14:49:39

CI中使用log4php调试程序

下载log4php。我下载的版本是:apache-log4php-2.3.0-src.zip。借压缩,将压缩文件中的src/main/php/文件夹拷贝到CI的application/thrid_party/目录中,并将此文件夹(php),改名为log4php。
在log4php文件夹中建立log4php的配置文件,文件名为:log4php.properties。此配置文件内容如下:

log4php.rootLogger=DEBUG, A1

#输出到页面
log4php.appender.A1 = LoggerAppenderEcho
log4php.appender.A1.layout = LoggerLayoutHtml

#输出到文件
log4php.appender.A2 = LoggerAppenderDailyFile
log4php.appender.A2.layout = LoggerLayoutPattern
log4php.appender.A2.layout.ConversionPattern = "%d{ISO8601} [%p] %c: %m (at %F line %L)%n"
log4php.appender.A2.datePattern = Ymd
log4php.appender.A2.file = logs/errorLog_%s.log

log4php的信息会显示在页面上。
打开根目录下的index.php文件,在文件中添加入下代码:

// 载入Log4php
define('LOG4PHP_DIR', APPPATH.'third_party/log4php/');
require_once LOG4PHP_DIR.'Logger.php';
Logger::configure(LOG4PHP_DIR.'log4php.properties');

/*
* --------------------------------------------------------------------
* LOAD THE BOOTSTRAP FILE
* --------------------------------------------------------------------
*
* And away we go...
*
*/
require_once BASEPATH.'core/CodeIgniter.php';

在需要调试的文件中,如/application/core/MY_Router.php文件中:

class MY_Router extends CI_Router {
    // 定义私有日志变量log
    private $log;
   
    /**
   * Constructor
   * Runs the route mapping function.
   */
    public function __construct() {
      parent::__construct();
      // 生成log
      $this->log = Logger::getLogger(__CLASS__);
      // 使用log
      $this->log->debug('core/MY_Router Class Initialized');
    }
   
    /**
   * Validates the supplied segments.Attempts to determine the path to the controller.
   *
   * @see CI_Router::_validate_request()
   * @access    private
   * @param    array
   * @return    array
   */
    function _validate_request($segments) {
      if (count($segments) == 0) {
            return $segments;
      }
      
      // 测试:查看路径
      $this->log->debug('segments数组的大小:'.count($segments));
      $tempDir = array();
      for ($i = 0; $i < count($segments); $i++) {
            $tempDir[] = $segments[$i];
            $this->log->debug('segments['.$i.']:'.$segments[$i]);
            $this->log->debug(APPPATH.'controllers/'.implode('/', $tempDir));
            if(!is_dir(APPPATH.'controllers/'.implode('/', $tempDir))) {
                unset($tempDir);
                break;
            }
      }
      $this->log->debug('segments = '.$segments);

      // Does the requested controller exist in the root folder?
      if (file_exists(APPPATH.'controllers/'.$segments.'.php')) {
            return $segments;
      }

      // Is the controller in a sub-folder?
      if (is_dir(APPPATH.'controllers/'.$segments)) {
            // Set the directory and remove it from the segment array
            //$this->set_directory($segments);
            //$segments = array_slice($segments, 1);
            
            $controllerPath = array();
            $is = 0;
            for(; $is < count($segments); $is++) {
                $controllerPath[] = $segments[$is];
                if(!is_dir(APPPATH.'controllers/'.implode('/', $controllerPath))) {
                  unset($controllerPath);
                  break;
                }
            }
            $this->log->debug('传递给set_directory的参数:'.implode('/', $controllerPath));
            $this->set_directory(implode('/', $controllerPath));
            $segments = array_slice($segments, $is);
$this->log->debug($segments);
            if (count($segments) > 0) {
$this->log->debug(APPPATH.'controllers/'.$this->fetch_directory().$segments.EXT);
                // Does the requested controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments.EXT)) {
$this->log->debug($this->routes['404_override']);
                  if ( ! empty($this->routes['404_override'])) {
                        $x = explode('/', $this->routes['404_override']);
$this->log->debug('x='.$x);
                        $this->set_directory('');
                        $this->set_class($x);
                        $this->set_method(isset($x) ? $x : 'index');

                        return $x;
                  }
                  else {
                        show_404($this->fetch_directory().$segments);
                  }
                }
            }
            else {
                // Is the method being specified in the route?
                if (strpos($this->default_controller, '/') !== FALSE) {
                  $x = explode('/', $this->default_controller);

                  $this->set_class($x);
                  $this->set_method($x);
                }
                else {
                  $this->set_class($this->default_controller);
                  $this->set_method('index');
                }

                // Does the default controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.'.php')) {
                  $this->directory = '';
                  return array();
                }

            }

            return $segments;
      }


      // If we've gotten this far it means that the URI does not correlate to a valid
      // controller class.We will now see if there is an override
      if ( ! empty($this->routes['404_override'])) {
            $x = explode('/', $this->routes['404_override']);

            $this->set_class($x);
            $this->set_method(isset($x) ? $x : 'index');

            return $x;
      }


      // Nothing else to do at this point but show a 404
      show_404($segments);
    }
   
    /**
   *Set the directory name
   *
   * @access    public
   * @param    string
   * @return    void
   */
    function set_directory($dir) {
      // 原程序将$dir中的"/"或"."过滤掉,出于安全考虑吗?
      //$this->directory = str_replace(array('/', '.'), '', $dir).'/';
      $this->directory = $dir.'/';
    }
}
/* End of file MY_Routes.php */
/* Location: ./application/liberaies/MY_Routes.php */


运行后,显示如下的信息:


backwang 发表于 2014-7-16 16:43:52

LOG4的确不错哈!避免自己又去写日志系统

383332910 发表于 2014-7-17 10:25:39

看看了

383332910 发表于 2014-7-17 10:26:03

看看啥情况
页: [1]
查看完整版本: CI中使用log4php调试程序