Skip to content

Commit

Permalink
wonderful new logging system => yet to be finished
Browse files Browse the repository at this point in the history
TODO: tell zend that the attributes in Zend_Log have to be PROTECTED
  • Loading branch information
matthieu_ committed Jul 27, 2007
1 parent 7460e8a commit 575be77
Show file tree
Hide file tree
Showing 6 changed files with 252 additions and 15 deletions.
29 changes: 29 additions & 0 deletions config/config.ini.php
Expand Up @@ -18,6 +18,35 @@

[log]

; query profiling information (SQL, avg execution time, etc.)
query_profiles[] = screen
query_profiles[] = database
query_profiles[] = file

; all call to the API (method name, parameters, execution time, caller IP, etc.)
api_calls[] = screen
api_calls[] = database
api_calls[] = file

; exception raised
exceptions[] = screen
exceptions[] = database
exceptions[] = file

; error intercepted
errors[] = screen
errors[] = database
errors[] = file

; normal messages
messages[] = screen
messages[] = database
messages[] = file


[path]
log = logs/


[smarty]
template_dir = core/views/scripts
Expand Down
33 changes: 33 additions & 0 deletions index.php
Expand Up @@ -56,6 +56,39 @@

Piwik::createTables();




//$logger = new Piwik_Log_APICalls;
$logger = new Piwik_Log_Messages;

$configAPI = Zend_Registry::get('config')->log->api_calls;

foreach($configAPI as $recordTo)
{
switch($recordTo)
{
case 'screen':
$logger->addWriteToScreen();
break;

case 'database':
$logger->addWriteToDatabase();
break;

case 'file':
$logger->addWriteToFile();
break;

default:
throw new Exception("TODO");
break;
}
}

Zend_Registry::set('logger', $logger);


// Create auth object
$auth = Zend_Auth::getInstance();
$authAdapter = new Piwik_Auth();
Expand Down
8 changes: 4 additions & 4 deletions libs/Zend/Log.php
Expand Up @@ -44,22 +44,22 @@ class Zend_Log
* @var array of priorities where the keys are the
* priority numbers and the values are the priority names
*/
private $_priorities = array();
protected $_priorities = array();

/**
* @var array of Zend_Log_Writer_Abstract
*/
private $_writers = array();
protected $_writers = array();

/**
* @var array of Zend_Log_Filter_Interface
*/
private $_filters = array();
protected $_filters = array();

/**
* @var array of extra log event
*/
private $_extras = array();
protected $_extras = array();

/**
* Class constructor. Create a new logger
Expand Down
181 changes: 172 additions & 9 deletions modules/Log.php
@@ -1,26 +1,189 @@
<?php
Zend_Loader::loadClass('Zend_Log');
Zend_Loader::loadClass('Zend_Registry');
Zend_Loader::loadClass('Zend_Log');
Zend_Loader::loadClass('Zend_Log_Formatter_Interface');
Zend_Loader::loadClass('Zend_Log_Writer_Stream');
Zend_Loader::loadClass('Zend_Log_Writer_Db');


class Piwik_Log extends Zend_Log
{
function __construct()
private $logToDatabaseTableName = null;
private $logToDatabaseColumnMapping = null;
private $logToFileFilename = null;
private $fileFormatter = null;
private $screenFormatter = null;

function __construct( $logToFileFilename,
$fileFormatter,
$screenFormatter,
$logToDatabaseTableName,
$logToDatabaseColumnMapping )
{
parent::__construct();

Zend_Loader::loadClass('Zend_Log_Writer_Stream');
$writer = new Zend_Log_Writer_Stream('php://output');
$formatter = new Zend_Log_Formatter_Simple('%message% <br>' . PHP_EOL);
$writer->setFormatter($formatter);
$this->addWriter($writer);
Zend_Registry::set('logger', $this);
$this->logToFileFilename = $logToFileFilename;
$this->fileFormatter = $fileFormatter;
$this->screenFormatter = $screenFormatter;
$this->logToDatabaseTableName = $logToDatabaseTableName;
$this->logToDatabaseColumnMapping = $logToDatabaseColumnMapping;
}

static public function dump($var, $label=null)
{
Zend_Registry::get('logger')->log(Zend_Debug::dump($var, $label, false), Piwik_Log::DEBUG);
Zend_Registry::get('LoggerMessages')->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');
}
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
$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)
{
$str = implode(" ", $event);
return $str;
}
}

class Piwik_Log_Formatter_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 = '';
foreach($event as $name => $value)
{
$str .= "$name : $value \n<br>";
}
return $str;
}
}

class Piwik_Log_APICalls extends Piwik_Log
{
function __construct()
{
$logToFileFilename = 'api_call';
$logToDatabaseTableName = 'log_api_calls';//TODO generalize
$logToDatabaseColumnMapping = null;
$screenFormatter = new Piwik_Log_Formatter_ScreenFormatter;
$fileFormatter = new Piwik_Log_Formatter_FileFormatter;

parent::__construct($logToFileFilename,
$fileFormatter,
$screenFormatter,
$logToDatabaseTableName,
$logToDatabaseColumnMapping );

$this->setEventItem('ip', ip2long( Piwik::getIp() ) );
}

function log( $methodName, $parameters, $executionTime)
{
$event = array();
$event['methodName'] = $methodName;
$event['parameters'] = serialize($parameters);
$event['executionTime'] = $executionTime;

parent::log($event);
}
}

class Piwik_Log_Messages extends Piwik_Log
{
function __construct()
{
$logToFileFilename = 'message';
$logToDatabaseTableName = 'log_message';//TODO generalize
$logToDatabaseColumnMapping = null;
$screenFormatter = new Piwik_Log_Formatter_ScreenFormatter;
$fileFormatter = new Piwik_Log_Formatter_FileFormatter;

parent::__construct($logToFileFilename,
$fileFormatter,
$screenFormatter,
$logToDatabaseTableName,
$logToDatabaseColumnMapping );

$this->setEventItem('ip', ip2long( Piwik::getIp() ) );
}

public function log( $message )
{
$event = array();
$event['message'] = $message;

parent::log($event);
}
}

?>
3 changes: 3 additions & 0 deletions modules/Log/APICalls.php
@@ -0,0 +1,3 @@
<?php

?>
13 changes: 11 additions & 2 deletions modules/Piwik.php
Expand Up @@ -6,7 +6,7 @@ class Piwik

static public function log($message, $priority = Zend_Log::NOTICE)
{
Zend_Registry::get('logger')->log($message . PHP_EOL, $priority);
Zend_Registry::get('logger')->log($message . PHP_EOL);
}

static public function getTablesCreateSql()
Expand Down Expand Up @@ -52,10 +52,18 @@ static public function getTablesCreateSql()
);
return $tables;
}

static public function getIp()
{
//TODO test and move from piwik
return '127.0.0.1';
}

static public function getCurrentUserLogin()
{
return Zend_Registry::get('access')->getIdentity();
}

// Accessible either to the user itself
static public function checkUserIsSuperUserOrTheUser( $theUser )
{
Expand Down Expand Up @@ -156,7 +164,8 @@ static public function createDatabaseObject()

static public function createLogObject()
{
$log = new Piwik_Log;
//TODO
//$log = new Piwik_Log;
}
static public function createConfigObject()
{
Expand Down

0 comments on commit 575be77

Please sign in to comment.