Custom Logging Threshold

dan-mesa edited this page Dec 18, 2013 · 7 revisions

Extends the functionality of the CI_Log class by allowing users to choose which threshold levels they want to log, rather than logging all the way up to the given threshold value.

Usage

Create a file named Log.php in application/libraries/ and paste the script below into it:


<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 5.1.6 or newer
 *
 * @package  CodeIgniter
 * @author  ExpressionEngine Dev Team
 * @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
 * @license  http://codeigniter.com/user_guide/license.html
 * @link  http://codeigniter.com
 * @since  Version 1.0
 * @filesource
 */

// ------------------------------------------------------------------------

/**
 * Logging Class
 *
 * @package  CodeIgniter
 * @subpackage Libraries
 * @category Logging
 * @author  ExpressionEngine Dev Team
 * @link  http://codeigniter.com/user_guide/general/errors.html
 */
 
// ------------------------------------------------------------------------

/**
 * Custom Logging Threshold
 *
 * Extends the functionality of the CI_Log class by allowing users to choose which
 * threshold level(s) they want to log, rather than logging all the way up to the
 * given threshold.
 *
 * @package  CodeIgniter
 * @subpackage Libraries
 * @category Logging
 * @author  Matthew Switzer (StrayIdeas)
 * @link  http://codeigniter.com/wiki/Custom_Logging_Threshold/
 */
class CI_Log {

 protected $_log_path;
 protected $_threshold = 1;
 protected $_date_fmt = 'Y-m-d H:i:s';
 protected $_enabled = TRUE;
 protected $_levels = array('ERROR' => '1', 'DEBUG' => '2',  'INFO' => '3', 'ALL' => '4');

 /**
  * Constructor
  */
 public function __construct()
 {
  $config =& get_config();

  $this->_log_path = ($config['log_path'] != '') ? $config['log_path'] : APPPATH.'logs/';

  if ( ! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path))
  {
   $this->_enabled = FALSE;
  }

        // also allow threshold values to be passed as an array
  if (is_numeric($config['log_threshold']) OR is_array($config['log_threshold']))
  {
   $this->_threshold = $config['log_threshold'];
  }

  if ($config['log_date_format'] != '')
  {
   $this->_date_fmt = $config['log_date_format'];
  }
 }

 // --------------------------------------------------------------------

 /**
  * Write Log File
  *
  * Generally this function will be called using the global log_message() function
  *
  * @param string the error level
  * @param string the error message
  * @param bool whether the error is a native PHP error
  * @return bool
  */
 public function write_log($level = 'error', $msg, $php_error = FALSE)
 {
  if ($this->_enabled === FALSE)
  {
   return FALSE;
  }

  $level = strtoupper($level);

  if ( ! isset($this->_levels[$level])
  OR ($this->_levels[$level] > $this->_threshold)
        // if the threshold values is an array, check to see if the error level does not exist in it
  OR (is_array($this->_threshold) && ! in_array($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;
 }

}
// END Log Class

/* End of file Log.php */
/* Location: ./application/libraries/Log.php */

Next, open config.php and edit the value of the $config['log_threshold'] variable:


// pass an array containing the threshold values you want to log
$config['log_threshold'] = array(1, 3);

// this will log only informational messages
$config['log_threshold'] = array(3);

Note: If you wish to retain the original functionality of the $config['log_threshold'] variable, simply pass an integer as the value:


$config['log_threshold'] = 3;
Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.