diff options
Diffstat (limited to 'modules/Log.php')
-rwxr-xr-x | modules/Log.php | 259 |
1 files changed, 230 insertions, 29 deletions
diff --git a/modules/Log.php b/modules/Log.php index 29d05b9582..338bb3b8b0 100755 --- a/modules/Log.php +++ b/modules/Log.php @@ -22,16 +22,18 @@ class Piwik_Log extends Zend_Log { parent::__construct(); - $this->logToFileFilename = $logToFileFilename; + Piwik::mkdir(Zend_Registry::get('config')->path->log); + + $this->logToFileFilename = Zend_Registry::get('config')->path->log . $logToFileFilename; $this->fileFormatter = $fileFormatter; $this->screenFormatter = $screenFormatter; - $this->logToDatabaseTableName = $logToDatabaseTableName; + $this->logToDatabaseTableName = Piwik::prefixTable($logToDatabaseTableName); $this->logToDatabaseColumnMapping = $logToDatabaseColumnMapping; } static public function dump($var, $label=null) { - Zend_Registry::get('LoggerMessages')->log(Zend_Debug::dump($var, $label, false), Piwik_Log::DEBUG); + Zend_Registry::get('logger_message')->log(Zend_Debug::dump($var, $label, false), Piwik_Log::DEBUG); } function addWriteToFile() @@ -68,12 +70,7 @@ class Piwik_Log extends Zend_Log if (empty($this->_writers)) { throw new Zend_Log_Exception('No writers were added'); } - if(isset($event['priority'])) - { - if (! isset($this->_priorities[$event['priority']])) { - throw new Zend_Log_Exception('Bad log priority'); - } - } + $event['timestamp'] = date('c'); // pack into event required by filters and writers @@ -104,12 +101,30 @@ class Piwik_Log_Formatter_FileFormatter implements Zend_Log_Formatter_Interface */ public function format($event) { - $str = implode(" ", $event); + foreach($event as &$value) + { + $value = str_replace("\n", '\n', $value); + $value = '"'.$value.'"'; + } + $str = implode(" ", $event) . "\n"; return $str; } } -class Piwik_Log_Formatter_ScreenFormatter implements Zend_Log_Formatter_Interface +class Piwik_Log_Formatter_Message_ScreenFormatter implements Zend_Log_Formatter_Interface +{ + /** + * Formats data into a single line to be written by the writer. + * + * @param array $event event data + * @return string formatted line to write to the log + */ + public function format($event) + { + return $event['message']; + } +} +class Piwik_Log_Formatter_APICall_ScreenFormatter implements Zend_Log_Formatter_Interface { /** * Formats data into a single line to be written by the writer. @@ -119,23 +134,64 @@ class Piwik_Log_Formatter_ScreenFormatter implements Zend_Log_Formatter_Interfac */ public function format($event) { - $str = ''; - foreach($event as $name => $value) + $str = "\n<br> "; + $str .= "Called: {$event['class_name']}.{$event['method_name']} (took {$event['execution_time']}ms) \n<br>"; + $str .= "Parameters: "; + $parameterNamesAndDefault = unserialize($event['parameter_names_default_values']); + $parameterValues = unserialize($event['parameter_values']); + + $i = 0; + foreach($parameterNamesAndDefault as $pName => $pDefault) { - $str .= "$name : $value \n<br>"; + if(isset($parameterValues[$i])) + { + $currentValue = $parameterValues[$i]; + } + else + { + $currentValue = $pDefault; + } + + $currentValue = $this->formatValue($currentValue); + $str .= "$pName = $currentValue, "; + + $i++; } + $str .= "\n<br> "; + + $str .= "Returned: ".$this->formatValue($event['returned_value']); + $str .= "\n<br> "; return $str; } + + private function formatValue( $value ) + { + if(is_string($value)) + { + $value = "'$value'"; + } + if(is_null($value)) + { + $value= 'null'; + } + if(is_array($value)) + { + $value = "array( ".implode(", ", $value). ")"; + } + return $value; + + } } -class Piwik_Log_APICalls extends Piwik_Log +class Piwik_Log_APICall extends Piwik_Log { + const ID = 'logger_api_call'; function __construct() { - $logToFileFilename = 'api_call'; - $logToDatabaseTableName = 'log_api_calls';//TODO generalize + $logToFileFilename = self::ID; + $logToDatabaseTableName = self::ID; $logToDatabaseColumnMapping = null; - $screenFormatter = new Piwik_Log_Formatter_ScreenFormatter; + $screenFormatter = new Piwik_Log_Formatter_APICall_ScreenFormatter; $fileFormatter = new Piwik_Log_Formatter_FileFormatter; parent::__construct($logToFileFilename, @@ -144,28 +200,32 @@ class Piwik_Log_APICalls extends Piwik_Log $logToDatabaseTableName, $logToDatabaseColumnMapping ); - $this->setEventItem('ip', ip2long( Piwik::getIp() ) ); + $this->setEventItem('caller_ip', ip2long( Piwik::getIp() ) ); } - function log( $methodName, $parameters, $executionTime) + function log( $className, $methodName, $parameterNames, $parameterValues, $executionTime, $returnedValue) { $event = array(); - $event['methodName'] = $methodName; - $event['parameters'] = serialize($parameters); - $event['executionTime'] = $executionTime; + $event['class_name'] = $className; + $event['method_name'] = $methodName; + $event['parameter_names_default_values'] = serialize($parameterNames); + $event['parameter_values'] = serialize($parameterValues); + $event['execution_time'] = $executionTime; + $event['returned_value'] = is_array($returnedValue) ? serialize($returnedValue) : $returnedValue; parent::log($event); } } -class Piwik_Log_Messages extends Piwik_Log +class Piwik_Log_Message extends Piwik_Log { + const ID = 'logger_message'; function __construct() { - $logToFileFilename = 'message'; - $logToDatabaseTableName = 'log_message';//TODO generalize + $logToFileFilename = self::ID; + $logToDatabaseTableName = self::ID; $logToDatabaseColumnMapping = null; - $screenFormatter = new Piwik_Log_Formatter_ScreenFormatter; + $screenFormatter = new Piwik_Log_Formatter_Message_ScreenFormatter; $fileFormatter = new Piwik_Log_Formatter_FileFormatter; parent::__construct($logToFileFilename, @@ -173,8 +233,6 @@ class Piwik_Log_Messages extends Piwik_Log $screenFormatter, $logToDatabaseTableName, $logToDatabaseColumnMapping ); - - $this->setEventItem('ip', ip2long( Piwik::getIp() ) ); } public function log( $message ) @@ -186,4 +244,147 @@ class Piwik_Log_Messages extends Piwik_Log } } +class Piwik_Log_Formatter_Error_ScreenFormatter implements Zend_Log_Formatter_Interface +{ + /** + * Formats data into a single line to be written by the writer. + * + * @param array $event event data + * @return string formatted line to write to the log + */ + public function format($event) + { + $errno = $event['errno'] ; + $errstr = $event['message'] ; + $errfile = $event['errfile'] ; + $errline = $event['errline'] ; + $backtrace = $event['backtrace'] ; + + $strReturned = ''; + $errno = $errno & error_reporting(); + if($errno == 0) return ''; + if(!defined('E_STRICT')) define('E_STRICT', 2048); + if(!defined('E_RECOVERABLE_ERROR')) define('E_RECOVERABLE_ERROR', 4096); + if(!defined('E_EXCEPTION')) define('E_EXCEPTION', 8192); + $strReturned .= "\n<div style='word-wrap: break-word; border: 3px solid red; padding:4px; width:70%; background-color:#FFFF96;'><b>"; + switch($errno) + { + case E_ERROR: $strReturned .= "Error"; break; + case E_WARNING: $strReturned .= "Warning"; break; + case E_PARSE: $strReturned .= "Parse Error"; break; + case E_NOTICE: $strReturned .= "Notice"; break; + case E_CORE_ERROR: $strReturned .= "Core Error"; break; + case E_CORE_WARNING: $strReturned .= "Core Warning"; break; + case E_COMPILE_ERROR: $strReturned .= "Compile Error"; break; + case E_COMPILE_WARNING: $strReturned .= "Compile Warning"; break; + case E_USER_ERROR: $strReturned .= "User Error"; break; + case E_USER_WARNING: $strReturned .= "User Warning"; break; + case E_USER_NOTICE: $strReturned .= "User Notice"; break; + case E_STRICT: $strReturned .= "Strict Notice"; break; + case E_RECOVERABLE_ERROR: $strReturned .= "Recoverable Error"; break; + case E_EXCEPTION: $strReturned .= "Exception"; break; + default: $strReturned .= "Unknown error ($errno)"; break; + } + $strReturned .= ":</b> <i>$errstr</i> in <b>$errfile</b> on line <b>$errline</b>\n"; + $strReturned .= "<br><br>Backtrace --><DIV style='font-family:Courier;font-size:10pt'>"; + $strReturned .= str_replace("\n", "<br>", $backtrace); + $strReturned .= "</div><br><br>"; + $strReturned .= "\n</pre></div><br>"; + + return $strReturned; + } +} + +class Piwik_Log_Formatter_Exception_ScreenFormatter implements Zend_Log_Formatter_Interface +{ + /** + * Formats data into a single line to be written by the writer. + * + * @param array $event event data + * @return string formatted line to write to the log + */ + public function format($event) + { + $errno = $event['errno'] ; + $errstr = $event['message'] ; + $errfile = $event['errfile'] ; + $errline = $event['errline'] ; + $backtrace = $event['backtrace'] ; + + $strReturned = ''; + $strReturned .= "\n<div style='word-wrap: break-word; border: 3px solid red; padding:4px; width:70%; background-color:#FFFF96;'><b>"; + $strReturned .= "Exception uncaught</b> <i>$errstr</i> in <b>$errfile</b> on line <b>$errline</b>\n"; + $strReturned .= "<br><br>Backtrace --><DIV style='font-family:Courier;font-size:10pt'>"; + $strReturned .= str_replace("\n", "<br>", $backtrace); + $strReturned .= "</div><br><br>"; + $strReturned .= "\n</pre></div><br>"; + + return $strReturned; + } +} + + +class Piwik_Log_Error extends Piwik_Log +{ + const ID = 'logger_error'; + function __construct() + { + $logToFileFilename = self::ID; + $logToDatabaseTableName = self::ID; + $logToDatabaseColumnMapping = null; + $screenFormatter = new Piwik_Log_Formatter_Error_ScreenFormatter; + $fileFormatter = new Piwik_Log_Formatter_FileFormatter; + + parent::__construct($logToFileFilename, + $fileFormatter, + $screenFormatter, + $logToDatabaseTableName, + $logToDatabaseColumnMapping ); + } + + public function log($errno, $errstr, $errfile, $errline, $backtrace) + { + $event = array(); + $event['errno'] = $errno; + $event['message'] = $errstr; + $event['errfile'] = $errfile; + $event['errline'] = $errline; + $event['backtrace'] = $backtrace; + + parent::log($event); + } +} + +class Piwik_Log_Exception extends Piwik_Log +{ + const ID = 'logger_exception'; + function __construct() + { + $logToFileFilename = self::ID; + $logToDatabaseTableName = self::ID; + $logToDatabaseColumnMapping = null; + $screenFormatter = new Piwik_Log_Formatter_Exception_ScreenFormatter; + $fileFormatter = new Piwik_Log_Formatter_FileFormatter; + + parent::__construct($logToFileFilename, + $fileFormatter, + $screenFormatter, + $logToDatabaseTableName, + $logToDatabaseColumnMapping ); + } + + public function log($exception) + { + + $event = array(); + $event['errno'] = $exception->getCode(); + $event['message'] = $exception->getMessage(); + $event['errfile'] = $exception->getFile(); + $event['errline'] = $exception->getLine(); + $event['backtrace'] = $exception->getTraceAsString(); + + parent::log($event); + } +} + ?> |