2009-08-19 05:55:23 +02:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Wrapper class for a logging handler like {@link Zend_Log}
|
|
|
|
* which takes a message (or a map of context variables) and
|
|
|
|
* sends it to one or more {@link Zend_Log_Writer_Abstract}
|
|
|
|
* subclasses for output.
|
|
|
|
*
|
2009-08-19 07:41:58 +02:00
|
|
|
* These priorities are currently supported:
|
|
|
|
* - SSLog::ERR
|
|
|
|
* - SSLog::WARN
|
|
|
|
* - SSLog::NOTICE
|
2009-08-19 05:55:23 +02:00
|
|
|
*
|
|
|
|
* You can add an error writer by calling {@link SSLog::add_writer()}
|
|
|
|
*
|
2009-08-19 23:55:03 +02:00
|
|
|
* Example usage of logging errors by email notification:
|
2009-08-19 05:55:23 +02:00
|
|
|
* <code>
|
2009-10-14 08:29:05 +02:00
|
|
|
* $logEmailWriter = new SSLogEmailWriter('my@email.com');
|
2009-08-19 23:55:03 +02:00
|
|
|
* SSLog::add_writer($logEmailWriter, SSLog::ERR);
|
|
|
|
* </code>
|
|
|
|
*
|
|
|
|
* Example usage of logging errors by file:
|
|
|
|
* <code>
|
|
|
|
* $logFileWriter = new SSLogFileWriter('/var/log/silverstripe/errors.log');
|
|
|
|
* SSLog::add_writer($logFileWriter, SSLog::ERR);
|
|
|
|
* </code>
|
|
|
|
*
|
|
|
|
* Each writer object can be assigned a formatter. The formatter is
|
|
|
|
* responsible for formatting the message before giving it to the writer.
|
|
|
|
* {@link SSLogErrorEmailFormatter} is such an example that formats errors
|
|
|
|
* into HTML for human readability in an email client.
|
|
|
|
*
|
|
|
|
* Formatters are added to writers like this:
|
|
|
|
* <code>
|
2009-10-14 08:29:05 +02:00
|
|
|
* $logEmailWriter = new SSLogEmailWriter('my@email.com');
|
2009-08-19 23:55:03 +02:00
|
|
|
* $myEmailFormatter = new MyLogEmailFormatter();
|
|
|
|
* $logEmailWriter->setFormatter($myEmailFormatter);
|
2009-08-19 05:55:23 +02:00
|
|
|
* </code>
|
|
|
|
*
|
|
|
|
* @package sapphire
|
|
|
|
* @subpackage dev
|
|
|
|
*/
|
|
|
|
|
|
|
|
require_once 'Zend/Log.php';
|
|
|
|
|
|
|
|
class SSLog {
|
|
|
|
|
|
|
|
const ERR = Zend_Log::ERR;
|
|
|
|
const WARN = Zend_Log::WARN;
|
2009-08-19 07:41:58 +02:00
|
|
|
const NOTICE = Zend_Log::NOTICE;
|
2009-08-19 05:55:23 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Logger class to use.
|
|
|
|
* @see SSLog::get_logger()
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
public static $logger_class = 'SSZendLog';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @see SSLog::get_logger()
|
|
|
|
* @var object
|
|
|
|
*/
|
|
|
|
protected static $logger;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the logger currently in use, or create a new
|
|
|
|
* one if it doesn't exist.
|
|
|
|
*
|
|
|
|
* @return object
|
|
|
|
*/
|
|
|
|
public static function get_logger() {
|
|
|
|
if(!self::$logger) {
|
|
|
|
self::$logger = new self::$logger_class;
|
|
|
|
}
|
|
|
|
return self::$logger;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get all writers in use by the logger.
|
|
|
|
* @return array Collection of Zend_Log_Writer_Abstract instances
|
|
|
|
*/
|
|
|
|
public static function get_writers() {
|
|
|
|
return self::get_logger()->getWriters();
|
|
|
|
}
|
|
|
|
|
2009-08-19 23:55:03 +02:00
|
|
|
/**
|
|
|
|
* Remove all writers currently in use.
|
|
|
|
*/
|
|
|
|
public static function clear_writers() {
|
|
|
|
self::get_logger()->clearWriters();
|
|
|
|
}
|
|
|
|
|
2009-08-19 05:55:23 +02:00
|
|
|
/**
|
|
|
|
* Remove a writer instance from the logger.
|
|
|
|
* @param object $writer Zend_Log_Writer_Abstract instance
|
|
|
|
*/
|
|
|
|
public static function remove_writer($writer) {
|
|
|
|
self::get_logger()->removeWriter($writer);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add a writer instance to the logger.
|
|
|
|
* @param object $writer Zend_Log_Writer_Abstract instance
|
|
|
|
* @param const $priority Priority. Possible values: SSLog::ERR or SSLog::WARN
|
2009-08-24 05:21:12 +02:00
|
|
|
* @param $comparison Priority comparison operator. Acts on the integer values of the error
|
|
|
|
* levels, where more serious errors are lower numbers. By default this is "=", which means only
|
|
|
|
* the given priority will be logged. Set to "<=" if you want to track errors of *at least*
|
|
|
|
* the given priority.
|
2009-08-19 05:55:23 +02:00
|
|
|
*/
|
2009-08-24 05:21:12 +02:00
|
|
|
public static function add_writer($writer, $priority = null, $comparison = '=') {
|
|
|
|
if($priority) $writer->addFilter(new Zend_Log_Filter_Priority($priority, $comparison));
|
2009-08-19 05:55:23 +02:00
|
|
|
self::get_logger()->addWriter($writer);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Dispatch a message by priority level.
|
|
|
|
*
|
|
|
|
* The message parameter can be either a string (a simple error
|
|
|
|
* message), or an array of variables. The latter is useful for passing
|
|
|
|
* along a list of debug information for the writer to handle, such as
|
|
|
|
* error code, error line, error context (backtrace).
|
|
|
|
*
|
|
|
|
* @param string|array $message String of error message, or array of variables
|
|
|
|
* @param const $priority Priority. Possible values: SSLog::ERR or SSLog::WARN
|
|
|
|
*/
|
|
|
|
public static function log($message, $priority) {
|
|
|
|
try {
|
|
|
|
self::get_logger()->log($message, $priority);
|
|
|
|
} catch(Exception $e) {
|
|
|
|
// @todo How do we handle exceptions thrown from Zend_Log?
|
|
|
|
// For example, an exception is thrown if no writers are added
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|