path->log);
$this->logToFileFilename = Zend_Registry::get('config')->path->log . $logToFileFilename;
$this->fileFormatter = $fileFormatter;
$this->screenFormatter = $screenFormatter;
$this->logToDatabaseTableName = Piwik::prefixTable($logToDatabaseTableName);
$this->logToDatabaseColumnMapping = $logToDatabaseColumnMapping;
}
static public function dump($var, $label=null)
{
Zend_Registry::get('logger_message')->log(Zend_Debug::dump($var, $label, false), Piwik_Log::DEBUG);
}
function addWriteToFile()
{
$writerFile = new Zend_Log_Writer_Stream($this->logToFileFilename);
$writerFile->setFormatter( $this->fileFormatter );
$this->addWriter($writerFile);
}
function addWriteToDatabase()
{
$writerDb = new Zend_Log_Writer_Db(
Zend_Registry::get('db'),
$this->logToDatabaseTableName,
$this->logToDatabaseColumnMapping);
$this->addWriter($writerDb);
}
function addWriteToScreen()
{
$writerScreen = new Zend_Log_Writer_Stream('php://output');
$writerScreen->setFormatter( $this->screenFormatter );
$this->addWriter($writerScreen);
}
/**
* Log an event
* Overload Zend_log::log cos its too weak for our requirements
*/
public function log($event)
{
// sanity checks
if (empty($this->_writers)) {
throw new Zend_Log_Exception('No writers were added');
}
$event['timestamp'] = date('c');
// pack into event required by filters and writers
$event = array_merge( $event, $this->_extras);
// abort if rejected by the global filters
foreach ($this->_filters as $filter) {
if (! $filter->accept($event)) {
return;
}
}
// send to each writer
foreach ($this->_writers as $writer) {
$writer->write($event);
}
}
}
class Piwik_Log_Formatter_FileFormatter 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)
{
foreach($event as &$value)
{
$value = str_replace("\n", '\n', $value);
$value = '"'.$value.'"';
}
$str = implode(" ", $event) . "\n";
return $str;
}
}
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.
*
* @param array $event event data
* @return string formatted line to write to the log
*/
public function format($event)
{
$str = "\n
";
$str .= "Called: {$event['class_name']}.{$event['method_name']} (took {$event['execution_time']}ms) \n
";
$str .= "Parameters: ";
$parameterNamesAndDefault = unserialize($event['parameter_names_default_values']);
$parameterValues = unserialize($event['parameter_values']);
$i = 0;
foreach($parameterNamesAndDefault as $pName => $pDefault)
{
if(isset($parameterValues[$i]))
{
$currentValue = $parameterValues[$i];
}
else
{
$currentValue = $pDefault;
}
$currentValue = $this->formatValue($currentValue);
$str .= "$pName = $currentValue, ";
$i++;
}
$str .= "\n
";
$str .= "Returned: ".$this->formatValue($event['returned_value']);
$str .= "\n
";
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_APICall extends Piwik_Log
{
const ID = 'logger_api_call';
function __construct()
{
$logToFileFilename = self::ID;
$logToDatabaseTableName = self::ID;
$logToDatabaseColumnMapping = null;
$screenFormatter = new Piwik_Log_Formatter_APICall_ScreenFormatter;
$fileFormatter = new Piwik_Log_Formatter_FileFormatter;
parent::__construct($logToFileFilename,
$fileFormatter,
$screenFormatter,
$logToDatabaseTableName,
$logToDatabaseColumnMapping );
$this->setEventItem('caller_ip', ip2long( Piwik::getIp() ) );
}
function log( $className, $methodName, $parameterNames, $parameterValues, $executionTime, $returnedValue)
{
$event = array();
$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_Message extends Piwik_Log
{
const ID = 'logger_message';
function __construct()
{
$logToFileFilename = self::ID;
$logToDatabaseTableName = self::ID;
$logToDatabaseColumnMapping = null;
$screenFormatter = new Piwik_Log_Formatter_Message_ScreenFormatter;
$fileFormatter = new Piwik_Log_Formatter_FileFormatter;
parent::__construct($logToFileFilename,
$fileFormatter,
$screenFormatter,
$logToDatabaseTableName,
$logToDatabaseColumnMapping );
}
public function log( $message )
{
$event = array();
$event['message'] = $message;
parent::log($event);
}
}
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