[ Index ]

PHP Cross Reference of Akelos Framework

title

Body

[close]

/ -> AkLogger.php (source)

   1  <?php
   2  /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
   3  
   4  // WARNING. This is experimental. We might replace this by Logger4PHP
   5  
   6  // +----------------------------------------------------------------------+
   7  // | Akelos Framework - http://www.akelos.org                             |
   8  // +----------------------------------------------------------------------+
   9  // | Copyright (c) 2002-2006, Akelos Media, S.L.  & Bermi Ferrer Martinez |
  10  // | Released under the GNU Lesser General Public License, see LICENSE.txt|
  11  // +----------------------------------------------------------------------+
  12  
  13  /**
  14   * @package ActiveSupport
  15   * @subpackage Reporting
  16   * @author Bermi Ferrer <bermi a.t akelos c.om>
  17   * @copyright Copyright (c) 2002-2006, Akelos Media, S.L. http://www.akelos.org
  18   * @license GNU Lesser General Public License <http://www.gnu.org/copyleft/lesser.html>
  19   */
  20  
  21  require_once (AK_LIB_DIR.DS.'Ak.php');
  22  
  23  defined('AK_LOG_DIR') ? null : define('AK_LOG_DIR', AK_BASE_DIR.DS.'log');
  24  
  25  // Default mail logger settings
  26  defined('AK_LOGER_DEFAULT_MAIL_DESTINATION')    ? null : define('AK_LOGER_DEFAULT_MAIL_DESTINATION', false);
  27  defined('AK_LOGER_DEFAULT_MAIL_SENDER')         ? null : define('AK_LOGER_DEFAULT_MAIL_SENDER', AK_HOST);
  28  defined('AK_LOGER_DEFAULT_MAIL_SUBJECT')        ? null : define('AK_LOGER_DEFAULT_MAIL_SUBJECT', 'Log message');
  29  
  30  // Default file logger settings
  31  defined('AK_LOGER_DEFAULT_LOG_FILE')            ? null : define('AK_LOGER_DEFAULT_LOG_FILE', AK_LOG_DIR.DS.AK_ENVIRONMENT.'.log');
  32  
  33  // Loggin events for log types
  34  defined('AK_LOGGER_DEBUG')      ? null : define('AK_LOGGER_DEBUG',      AK_MODE_FILE    | AK_MODE_DISPLAY);
  35  defined('AK_LOGGER_INFO')       ? null : define('AK_LOGGER_INFO',       AK_MODE_DISPLAY);
  36  defined('AK_LOGGER_MESSAGE')    ? null : define('AK_LOGGER_MESSAGE',    AK_MODE_FILE);
  37  defined('AK_LOGGER_NOTICE')     ? null : define('AK_LOGGER_NOTICE',     AK_MODE_DISPLAY | AK_MODE_FILE | AK_MODE_DIE);
  38  defined('AK_LOGGER_WARNING')    ? null : define('AK_LOGGER_WARNING',    AK_MODE_DISPLAY | AK_MODE_FILE | AK_MODE_DIE);
  39  defined('AK_LOGGER_ERROR')      ? null : define('AK_LOGGER_ERROR',      AK_MODE_DISPLAY | AK_MODE_FILE | AK_MODE_DIE);
  40  defined('AK_LOGGER_CRITICAL')   ? null : define('AK_LOGGER_CRITICAL',   AK_MODE_FILE    | AK_MODE_DIE);
  41  
  42  // Error loggin settings
  43  defined('AK_LOG_'.E_USER_ERROR)     ? null : define('AK_LOG_'.E_USER_ERROR, AK_MODE_FILE | AK_MODE_DIE);
  44  defined('AK_LOG_'.E_USER_WARNING)   ? null : define('AK_LOG_'.E_USER_WARNING, AK_MODE_DISPLAY | AK_MODE_FILE | AK_MODE_DIE);
  45  defined('AK_LOG_'.E_USER_NOTICE)    ? null : define('AK_LOG_'.E_USER_NOTICE, AK_MODE_DISPLAY | AK_MODE_FILE | AK_MODE_DIE);
  46  defined('AK_LOG_'.E_WARNING)        ? null : define('AK_LOG_'.E_WARNING, AK_MODE_FILE);
  47  defined('AK_LOG_'.E_NOTICE)         ? null : define('AK_LOG_'.E_NOTICE, AK_MODE_FILE);
  48  
  49  defined('AK_LOG_ENABLE_COLORING') ? null : define('AK_LOG_ENABLE_COLORING', true);
  50  
  51  class AkLogger
  52  {
  53      var $_log_params                = array();
  54      var $print_display_message      = true;
  55      var $extended_details           = false;
  56      var $default_mail_destination   = AK_LOGER_DEFAULT_MAIL_DESTINATION;
  57      var $default_mail_sender        = AK_LOGER_DEFAULT_MAIL_SENDER;
  58      var $default_mail_subject       = AK_LOGER_DEFAULT_MAIL_SUBJECT;
  59      var $error_file                 = AK_LOGER_DEFAULT_LOG_FILE;
  60      var $log_type;
  61  
  62      function AkLogger($mode = AK_LOGGER_MESSAGE)
  63      {
  64          $this->default_log_settings = $mode;
  65      }
  66  
  67      function log($type, $message, $vars = array(), $event_code = null)
  68      {
  69          $type = strtoupper($type);
  70          $event_code = empty ($event_code) ? (defined('AK_LOGGER_'.$type) ? 'AK_LOGGER_'.$type : AK_LOGGER_INFO) : $event_code;
  71          $this->_log($type, $message, $vars, $event_code);
  72      }
  73  
  74      function debug($message, $vars = array(), $event_code = null)
  75      {
  76          $this->log(__FUNCTION__, $message, $vars, $event_code);
  77      }
  78  
  79      function info($message, $vars = array(), $event_code = null)
  80      {
  81          $this->log(__FUNCTION__, $message, $vars, $event_code);
  82      }
  83  
  84      function message($message, $vars = array(), $event_code = null)
  85      {
  86          $this->log(__FUNCTION__, $message, $vars, $event_code);
  87      }
  88  
  89      function notice($message, $vars = array(), $event_code = null)
  90      {
  91          $this->log(__FUNCTION__, $message, $vars, $event_code);
  92      }
  93  
  94      function warning($message, $vars = array(), $event_code = null)
  95      {
  96          $this->log(__FUNCTION__, $message, $vars, $event_code);
  97      }
  98  
  99      function error($message, $vars = array(), $event_code = null)
 100      {
 101          $this->log(__FUNCTION__, $message, $vars, $event_code);
 102      }
 103  
 104      function critical($message, $vars = array(), $event_code = null)
 105      {
 106          $this->log(__FUNCTION__, $message, $vars, $event_code);
 107      }
 108  
 109      function _log($error_mode, $error_message, $vars=array(), $event_code = null)
 110      {
 111          $this->setLogParams($vars);
 112          $this->mode = defined('AK_LOG_'.$error_mode) ? constant('AK_LOG_'.$error_mode) : $this->default_log_settings;
 113          $type = $this->log_type;
 114          $this->mode & AK_MODE_DISPLAY ? $this->_displayLog($type, $error_mode, $error_message) : null;
 115          $this->mode & AK_MODE_FILE ? $this->_appendLogToFile($type, $error_mode, $error_message) : null;
 116          $this->mode & AK_MODE_DATABASE ? $this->_saveLogInDatabase($type, $error_mode, $error_message) : null;
 117          $this->mode & AK_MODE_MAIL ? $this->_mailLog($type, $error_mode, $error_message) : null;
 118          $this->mode & AK_MODE_DIE ? exit : null;
 119      }
 120  
 121      function _displayLog($type, $error_mode, $error_message)
 122      {
 123          $message = $this->_getLogFormatedAsHtml($type, $error_mode, $error_message);
 124          if($this->print_display_message){
 125              Ak::trace($message);
 126          }
 127          return $message;
 128      }
 129      function _mailLog($type, $error_mode, $error_message)
 130      {
 131          if(!empty($this->default_mail_destination)){
 132              $message = $this->_getLogFormatedAsString($type, $error_mode, $error_message);
 133              $message = strip_tags(str_replace('<li>',' - ',$message));
 134              Ak::mail($this->default_mail_sender, $this->default_mail_destination, $this->default_mail_subject, $message);
 135          }
 136      }
 137      function _appendLogToFile($type, $error_mode, $error_message)
 138      {
 139          $filename = $this->error_file;
 140          if(!is_writable($filename)){
 141              clearstatcache();
 142              Ak::file_put_contents($filename,'');
 143              if(!is_writable($filename)){
 144                  trigger_error($this->internalError($this->t('Error writing file: %filename Description:',array('%filename'=>$filename)).$error_message,__FILE__,__LINE__), E_USER_NOTICE);
 145                  return ;
 146              }
 147          }
 148  
 149          $message = $this->_getLogFormatedAsString($type, $error_mode, $error_message);
 150          if(!$fp = fopen($filename, 'a')) {
 151              die($this->internalError($this->t('Cannot open file (%file)', array('%file'=>$filename)),__FILE__,__LINE__));
 152          }
 153          @flock($fp, LOCK_EX);
 154          if (@fwrite($fp, $message) === FALSE) {
 155              @flock ($fp, LOCK_UN);
 156              die($this->internalError($this->t('Error writing file: %filename Description:',array('%filename'=>$filename)).$error_message,__FILE__,__LINE__));
 157          }
 158          @flock ($fp, LOCK_UN);
 159          @fclose($fp);
 160      }
 161  
 162      function _saveLogInDatabase($type, $error_mode, $error_message)
 163      {
 164          $db =& Ak::db();
 165          $message = $this->_getLogFormatedAsRawText($type, $error_mode, $error_message);
 166          $sql = 'INSERT INTO log (user_id, type, message, severity, location, hostname, created) '.
 167          " VALUES (0, ".$db->quote_string($type).", ".$db->quote_string($message).', '.($this->mode & AK_MODE_DIE ? 100 : 0).', '.
 168          $db->quote_string(AK_CURRENT_URL).', '.$db->quote_string($_SERVER['REMOTE_ADDR']).', '.$db->quote_string(Ak::getTimestamp()).');';
 169          if ($db->execute($sql) === false) {
 170              die($this->internalError($this->t('Error inserting: ').$db->ErrorMsg(),__FILE__,__LINE__));
 171          }
 172      }
 173  
 174      function _getLogFormatedAsHtml($type, $error_mode, $error_message)
 175      {
 176          $error_type = $error_mode ? 'error' : 'info';
 177          $message = "\n<div id='logger_$error_type'>\n<p>".$this->t(ucfirst($error_type)).": [$error_mode] - $error_message</p>\n";
 178          $params = array_merge($this->_log_params, ($this->extended_details ? array('remote_address'=>$_SERVER['REMOTE_ADDR'], 'browser'=>$_SERVER['HTTP_USER_AGENT']) : array() ));
 179          $details = '';
 180          foreach ($params as $k=>$v){
 181              $details .= "<li><span>".$k.":</span> $v</li>\n";
 182          }
 183          return empty($details) ? $message.'</div>' : $message."<ul>\n$details\n</ul>\n</div>";
 184      }
 185  
 186      function _getLogFormatedAsString($type, $error_mode, $error_message, $serialized = false)
 187      {
 188          $message = date('r')."\t[$error_mode]\t$error_message";
 189          $params = array_merge($this->_log_params, ($this->extended_details ? array('remote_address'=>$_SERVER['REMOTE_ADDR'], 'browser'=>$_SERVER['HTTP_USER_AGENT']) : array() ));
 190  
 191          if($serialized){
 192              $message .= (count($params) ? "\t".serialize($params) : '');
 193          }else{
 194              $details = '';
 195              foreach ($params as $k=>$v){
 196                  $details .= "\n\t\t- ".$k.": $v";
 197              }
 198              $message .= empty($details) ? "\n" : "\n\t".'PARAMS{'.$details."\t\n}\n";
 199          }
 200          return $message;
 201      }
 202  
 203      function _getLogFormatedAsRawText($type, $error_mode, $error_message)
 204      {
 205          return $this->_getLogFormatedAsString($type, $error_mode, $error_message, $filename, $line_number, true);
 206      }
 207  
 208  
 209      function setLogParams($log_params)
 210      {
 211          $this->_log_params = $log_params;
 212      }
 213  
 214      function getLogParams()
 215      {
 216          return is_array($this->_log_params) ? $this->_log_params : array();
 217      }
 218  
 219  
 220      function internalError($message, $file, $line)
 221      {
 222          return "<div id='internalError'><p><b>Error:</b> [internal] - $message<br /><b>File:</b> $file at line $line</p></div>";
 223      }
 224  
 225      function t($string, $array = null)
 226      {
 227          return Ak::t($string, $array, 'error');
 228      }
 229  
 230      function formatText($text, $color = 'normal')
 231      {
 232          if(!AK_LOG_ENABLE_COLORING){
 233              return $text;
 234          }
 235          
 236          $colors = array(
 237          'light_red '      => '[1;31m',
 238          'light_green'      => '[1;32m',
 239          'yellow'      => '[1;33m',
 240          'light_blue'      => '[1;34m',
 241          'magenta'      => '[1;35m',
 242          'light_cyan'      => '[1;36m',
 243          'white'      => '[1;37m',
 244          'normal'      => '[0m',
 245          'black'      => '[0;30m',
 246          'red'      => '[0;31m',
 247          'green'      => '[0;32m',
 248          'brown'      => '[0;33m',
 249          'blue'      => '[0;34m',
 250          'cyan'      => '[0;36m',
 251          'bold'      => '[1m',
 252          'underscore'      => '[4m',
 253          'reverse'      => '[7m'
 254          );
 255  
 256          return "\033".(isset($colors[$color]) ? $colors[$color] : '[0m').$text."\033[0m";
 257      }
 258  }
 259  
 260  ?>


Generated: Mon Oct 27 12:43:49 2008 Cross-referenced by PHPXref 0.6