PageRenderTime 49ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/AkLogger.php

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