--- nfo/php/libs/net.php.pear/Log.php 2002/10/25 15:15:23 1.1 +++ nfo/php/libs/net.php.pear/Log.php 2003/02/05 21:43:52 1.2 @@ -1,194 +1,252 @@ - - * @author Jon Parise - * @version $Revision: 1.1 $ - * @since Horde 1.3 - */ -class Log { - - // {{{ properties - - /** Boolean indicating whether or not the log connection is - currently open. */ - var $opened = false; - - /** String holding the identifier that will be stored along with - each logged message. */ - var $ident = ''; - - /** Array holding all Log_observer objects that wish to be notified - of any messages that we handle. */ - var $listeners = array(); - - // }}} - - // {{{ factory() - /** - * Attempts to return a concrete Log instance of $log_type. - * - * @param $log_type The type of concrete Log subclass to return. - * Attempt to dynamically include the code for this - * subclass. Currently, valid values are 'syslog', - * 'sql', 'file', and 'mcal'. - * - * @param $log_name (optional) The name of the actually log file, - * table, or other specific store to use. Defaults - * to an empty string, with which the subclass will - * attempt to do something intelligent. - * - * @param $ident (optional) The indentity reported to the log system. - * - * @param $conf (optional) A hash containing any additional - * configuration information that a subclass might need. - * - * @return The newly created concrete Log instance, or an - * false on an error. - */ - function factory ($log_type, $log_name = '', $ident = '', $conf = array()) { - $log_type = strtolower($log_type); - $classfile = 'Log/' . $log_type . '.php'; - if (@include_once $classfile) { - $class = 'Log_' . $log_type; - return new $class($log_name, $ident, $conf); - } else { - return false; - } - } - // }}} - - // {{{ singleton() - /** - * Attempts to return a reference to a concrete Log instance of - * $log_type, only creating a new instance if no log instance with - * the same parameters currently exists. - * - * You should use this if there are multiple places you might - * create a logger, you don't want to create multiple loggers, and - * you don't want to check for the existance of one each time. The - * singleton pattern does all the checking work for you. - * - * You MUST call this method with the $var = &Log::singleton() - * syntax. Without the ampersand (&) in front of the method name, - * you will not get a reference, you will get a copy. - * - * @param $log_type The type of concrete Log subclass to return. - * Attempt to dynamically include the code for - * this subclass. Currently, valid values are - * 'syslog', 'sql', 'file', and 'mcal'. - * - * @param $log_name (optional) The name of the actually log file, - * table, or other specific store to use. Defaults - * to an empty string, with which the subclass will - * attempt to do something intelligent. - * - * @param $ident (optional) The identity reported to the log system. - * - * @param $conf (optional) A hash containing any additional - * configuration information that a subclass might need. - * - * @return The concrete Log reference, or false on an error. - */ - function &singleton ($log_type, $log_name = '', $ident = '', $conf = array()) { - static $instances; - if (!isset($instances)) $instances = array(); - - $signature = md5($log_type . '][' . $log_name . '][' . $ident . '][' . implode('][', $conf)); - if (!isset($instances[$signature])) { - $instances[$signature] = Log::factory($log_type, $log_name, $ident, $conf); - } - return $instances[$signature]; - } - // }}} - - // {{{ priorityToString() - /** - * Returns the string representation of a LOG_* integer constant. - * - * @param $priority The LOG_* integer constant. - * - * @return The string representation of $priority. - */ - function priorityToString ($priority) { - $priorities = array( - LOG_EMERG => 'emergency', - LOG_ALERT => 'alert', - LOG_CRIT => 'critical', - LOG_ERR => 'error', - LOG_WARNING => 'warning', - LOG_NOTICE => 'notice', - LOG_INFO => 'info', - LOG_DEBUG => 'debug' - ); - return $priorities[$priority]; - } - // }}} - - // {{{ attach() - /** - * Adds a Log_observer instance to the list of observers that are - * be notified when a message is logged. - * - * @param $logObserver The Log_observer instance to be added to - * the $listeners array. - */ - function attach (&$logObserver) { - if (!is_object($logObserver)) - return false; - - $logObserver->_listenerID = uniqid(rand()); - - $this->listeners[$logObserver->_listenerID] = &$logObserver; - } - // }}} - - // {{{ detach() - /** - * Removes a Log_observer instance from the list of observers. - * - * @param $logObserver The Log_observer instance to be removed - * from the $listeners array. - */ - function detach ($logObserver) { - if (isset($this->listeners[$logObserver->_listenerID])) - unset($this->listeners[$logObserver->_listenerID]); - } - // }}} - - // {{{ notifyAll() - /** - * Sends any Log_observer objects listening to this Log the message - * that was just logged. - * - * @param $messageOb The data structure holding all relevant log - * information - the message, the priority, what - * log this is, etc. - */ - function notifyAll ($messageOb) { - reset($this->listeners); - foreach ($this->listeners as $listener) { - if ($messageOb['priority'] <= $listener->priority) - $listener->notify($messageOb); - } - } - // }}} - - // {{{ isComposite() - /** - * @return a Boolean: true if this is a composite class, false - * otherwise. The composite subclass overrides this to return - * true. - */ - function isComposite () { - return false; - } - // }}} -} - -?> + + * @author Jon Parise + * @version $Revision: 1.2 $ + * @since Horde 1.3 + * @package Log + */ +class Log extends PEAR { + + /** + * Indicates whether or not the log can been opened / connected. + * + * @var boolean + * @access private + */ + var $_opened = false; + + /** + * The label that uniquely identifies this set of log messages. + * + * @var string + * @access private + */ + var $_ident = ''; + + /** + * The maximum priority level at which to log a message. + * + * @var int + * @access private + */ + var $_maxLevel = PEAR_LOG_DEBUG; + + /** + * Holds all Log_observer objects that wish to be notified of new messages. + * + * @var array + * @access private + */ + var $_listeners = array(); + + + /** + * Attempts to return a concrete Log instance of $type. + * + * @param string $type The type of concrete Log subclass to return. + * Attempt to dynamically include the code for + * this subclass. Currently, valid values are + * 'console', 'syslog', 'sql', 'file', and 'mcal'. + * + * @param string $name The name of the actually log file, table, or + * other specific store to use. Defaults to an + * empty string, with which the subclass will + * attempt to do something intelligent. + * + * @param string $ident The identity reported to the log system. + * + * @param array $conf A hash containing any additional configuration + * information that a subclass might need. + * + * @param int $maxLevel Maximum priority level at which to log. + * + * @return object Log The newly created concrete Log instance, or an + * false on an error. + * @access public + */ + function &factory($type, $name = '', $ident = '', $conf = array(), + $maxLevel = PEAR_LOG_DEBUG) + { + $type = strtolower($type); + $classfile = 'Log/' . $type . '.php'; + if (@include_once $classfile) { + $class = 'Log_' . $type; + return new $class($name, $ident, $conf, $maxLevel); + } else { + return false; + } + } + + /** + * Attempts to return a reference to a concrete Log instance of $type, only + * creating a new instance if no log instance with the same parameters + * currently exists. + * + * You should use this if there are multiple places you might create a + * logger, you don't want to create multiple loggers, and you don't want to + * check for the existance of one each time. The singleton pattern does all + * the checking work for you. + * + * You MUST call this method with the $var = &Log::singleton() syntax. + * Without the ampersand (&) in front of the method name, you will not get + * a reference, you will get a copy. + * + * @param string $type The type of concrete Log subclass to return. + * Attempt to dynamically include the code for + * this subclass. Currently, valid values are + * 'console', 'syslog', 'sql', 'file', and 'mcal'. + * + * @param string $name The name of the actually log file, table, or + * other specific store to use. Defaults to an + * empty string, with which the subclass will + * attempt to do something intelligent. + * + * @param string $ident The identity reported to the log system. + * + * @param array $conf A hash containing any additional configuration + * information that a subclass might need. + * + * @param int $maxLevel Minimum priority level at which to log. + * + * @return object Log The newly created concrete Log instance, or an + * false on an error. + * @access public + */ + function &singleton($type, $name = '', $ident = '', $conf = array(), + $maxLevel = PEAR_LOG_DEBUG) + { + static $instances; + if (!isset($instances)) $instances = array(); + + $signature = serialize(array($type, $name, $ident, $conf, $maxLevel)); + if (!isset($instances[$signature])) { + $instances[$signature] = &Log::factory($type, $name, $ident, $conf, + $maxLevel); + } + + return $instances[$signature]; + } + + /** + * Abstract implementation of the close() method. + */ + function close() + { + return false; + } + + /** + * Abstract implementation of the log() method. + */ + function log($message, $priority = PEAR_LOG_INFO) + { + return false; + } + + /** + * Returns the string representation of a PEAR_LOG_* integer constant. + * + * @param int $priority A PEAR_LOG_* integer constant. + * + * @return string The string representation of $priority. + */ + function priorityToString($priority) + { + $priorities = array( + PEAR_LOG_EMERG => 'emergency', + PEAR_LOG_ALERT => 'alert', + PEAR_LOG_CRIT => 'critical', + PEAR_LOG_ERR => 'error', + PEAR_LOG_WARNING => 'warning', + PEAR_LOG_NOTICE => 'notice', + PEAR_LOG_INFO => 'info', + PEAR_LOG_DEBUG => 'debug' + ); + + return $priorities[$priority]; + } + + /** + * Adds a Log_observer instance to the list of observers that are be + * notified when a message is logged. + * + * @param object Log_observer &$logObserver The Log_observer instance to + * be added to the $listeners + * array. + * @access public + */ + function attach(&$logObserver) + { + if (!is_object($logObserver)) { + return false; + } + + $logObserver->_listenerID = uniqid(rand()); + + $this->_listeners[$logObserver->_listenerID] = &$logObserver; + } + + /** + * Removes a Log_observer instance from the list of observers. + * + * @param object Log_observer $logObserver The Log_observer instance to + * be removed from the $listeners + * array. + * @access public + */ + function detach($logObserver) + { + if (isset($this->_listeners[$logObserver->_listenerID])) { + unset($this->_listeners[$logObserver->_listenerID]); + } + } + + /** + * Sends any Log_observer objects listening to this Log the message that + * was just logged. + * + * @param array $msgObj The data structure holding all relevant log + * information - the message, the priority, what + * log this is, etc. + */ + function notifyAll($msgObj) + { + reset($this->_listeners); + foreach ($this->_listeners as $listener) { + if ($msgObj['priority'] <= $listener->priority) { + $listener->notify($msgObj); + } + } + } + + /** + * Indicates whether this is a composite class. + * + * @return boolean True if this is a composite class. + */ + function isComposite() + { + return false; + } +} + +?>