|
|
@@ -59,6 +59,19 @@ class Zend_Log
|
|
|
protected $_extras = array();
|
|
|
|
|
|
/**
|
|
|
+ *
|
|
|
+ * @var string
|
|
|
+ */
|
|
|
+ protected $_defaultWriterNamespace = 'Zend_Log_Writer';
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @var string
|
|
|
+ */
|
|
|
+ protected $_defaultFilterNamespace = 'Zend_Log_Filter';
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
* Class constructor. Create a new logger
|
|
|
*
|
|
|
* @param Zend_Log_Writer_Abstract|null $writer default writer
|
|
|
@@ -74,6 +87,143 @@ class Zend_Log
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * Factory to construct the logger and one or more writers
|
|
|
+ * based on the configuration array
|
|
|
+ *
|
|
|
+ * @param mixed Array or instance of Zend_Config
|
|
|
+ * @return Zend_Log
|
|
|
+ */
|
|
|
+ static public function factory($config = array())
|
|
|
+ {
|
|
|
+ if ($config instanceof Zend_Config) {
|
|
|
+ $config = $config->toArray();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!is_array($config) || empty($config)) {
|
|
|
+ require_once 'Zend_Log_Exception.php';
|
|
|
+ throw new Zend_Log_Exception('Configuration must be an array or instance of Zend_Config');
|
|
|
+ }
|
|
|
+
|
|
|
+ $log = new Zend_Log;
|
|
|
+
|
|
|
+ if (!is_array(current($config))) {
|
|
|
+ $log->addWriter(current($config));
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ foreach($config as $writer) {
|
|
|
+ $log->addWriter($writer);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return $log;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Construct a writer object based on a configuration array
|
|
|
+ *
|
|
|
+ * @param array $spec config array with writer spec
|
|
|
+ * @return Zend_Log_Writer_Abstract
|
|
|
+ */
|
|
|
+ protected function _constructWriterFromConfig($config)
|
|
|
+ {
|
|
|
+ $writer = $this->_constructFromConfig('writer', $config, $this->_defaultWriterNamespace);
|
|
|
+
|
|
|
+ if (! $writer instanceof Zend_Log_Writer_Abstract) {
|
|
|
+ require_once 'Zend/Log/Exception.php';
|
|
|
+ throw new Zend_Log_Exception("{$writerName} does not extend Zend_Log_Writer_Abstract!");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isset($config['filterName'])) {
|
|
|
+ $filter = $this->_constructFilterFromConfig($config);
|
|
|
+ $writer->addFilter($filter);
|
|
|
+ }
|
|
|
+
|
|
|
+ return $writer;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Construct filter object from configuration array or Zend_Config object
|
|
|
+ *
|
|
|
+ * @param mixed $config Zend_Config or Array
|
|
|
+ * @return Zend_Log_Filter_Interface
|
|
|
+ */
|
|
|
+ protected function _constructFilterFromConfig($config)
|
|
|
+ {
|
|
|
+ $filter = $this->_constructFromConfig('filter', $config, $this->_defaultFilterNamespace);
|
|
|
+
|
|
|
+ if (! $filter instanceof Zend_Log_Filter_Interface) {
|
|
|
+ require_once 'Zend/Log/Exception.php';
|
|
|
+ throw new Zend_Log_Exception("{$filterName} does not implement Zend_Log_Filter_Interface");
|
|
|
+ }
|
|
|
+
|
|
|
+ return $filter;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Construct a filter or writer from config
|
|
|
+ *
|
|
|
+ * @param string $type 'writer' of 'filter'
|
|
|
+ * @param mixed $config Zend_Config or Array
|
|
|
+ * @param string $namespace
|
|
|
+ * @return object
|
|
|
+ */
|
|
|
+ protected function _constructFromConfig($type, $config, $namespace)
|
|
|
+ {
|
|
|
+ if ($config instanceof Zend_Config) {
|
|
|
+ $config = $config->toArray();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!is_array($config) || empty($config)) {
|
|
|
+ require_once 'Zend_Log_Exception.php';
|
|
|
+ throw new Zend_Log_Exception(
|
|
|
+ 'Configuration must be an array or instance of Zend_Config'
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ $params = isset($config[ $type .'Params' ]) ? $config[ $type .'Params' ] : array();
|
|
|
+ $className = $this->getClassName($config, $type, $namespace);
|
|
|
+ Zend_Loader::loadClass($className);
|
|
|
+
|
|
|
+ $reflection = new ReflectionClass($className);
|
|
|
+ if (!$reflection->implementsInterface('Zend_Log_FactoryInterface'))
|
|
|
+ {
|
|
|
+ throw new Zend_Log_Exception(
|
|
|
+ 'Driver does not implement Zend_Log_FactoryInterface and can not be constructed from config.'
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ return call_user_func(array($className, 'factory'), $params);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Get the writer or filter full classname
|
|
|
+ *
|
|
|
+ * @param array $config
|
|
|
+ * @param string $type filter|writer
|
|
|
+ * @param string $defaultNamespace
|
|
|
+ * @return string full classname
|
|
|
+ */
|
|
|
+ protected function getClassName($config, $type, $defaultNamespace)
|
|
|
+ {
|
|
|
+ if (!isset($config[ $type . 'Name' ])) {
|
|
|
+ require_once 'Zend/Log/Exception.php';
|
|
|
+ throw new Zend_Log_Exception("Specify {$type}Name in the configuration array");
|
|
|
+ }
|
|
|
+ $className = $config[ $type . 'Name' ];
|
|
|
+
|
|
|
+ $namespace = $defaultNamespace;
|
|
|
+ if (isset($config[ $type . 'Namespace' ])) {
|
|
|
+ $namespace = $config[ $type . 'Namespace' ];
|
|
|
+ }
|
|
|
+
|
|
|
+ $fullClassName = strtolower($namespace . '_' . $className);
|
|
|
+ $fullClassName = str_replace(' ', '_', ucwords(str_replace('_', ' ', $fullClassName)));
|
|
|
+ return $fullClassName;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* Class destructor. Shutdown log writers
|
|
|
*
|
|
|
* @return void
|
|
|
@@ -221,7 +371,11 @@ class Zend_Log
|
|
|
/** @see Zend_Log_Filter_Priority */
|
|
|
require_once 'Zend/Log/Filter/Priority.php';
|
|
|
$filter = new Zend_Log_Filter_Priority($filter);
|
|
|
- } elseif(!is_object($filter) || ! $filter instanceof Zend_Log_Filter_Interface) {
|
|
|
+
|
|
|
+ } elseif ($filter instanceof Zend_Config || is_array($filter)) {
|
|
|
+ $filter = $this->_constructFilterFromConfig($filter);
|
|
|
+
|
|
|
+ } elseif(! $filter instanceof Zend_Log_Filter_Interface) {
|
|
|
/** @see Zend_Log_Exception */
|
|
|
require_once 'Zend/Log/Exception.php';
|
|
|
throw new Zend_Log_Exception('Invalid filter provided');
|
|
|
@@ -234,11 +388,23 @@ class Zend_Log
|
|
|
* Add a writer. A writer is responsible for taking a log
|
|
|
* message and writing it out to storage.
|
|
|
*
|
|
|
- * @param Zend_Log_Writer_Abstract $writer
|
|
|
+ * @param mixed $writer Zend_Log_Writer_Abstract or Config array
|
|
|
* @return void
|
|
|
*/
|
|
|
- public function addWriter(Zend_Log_Writer_Abstract $writer)
|
|
|
+ public function addWriter($writer)
|
|
|
{
|
|
|
+ if ( is_array($writer) || $writer instanceof Zend_Config) {
|
|
|
+ $writer = $this->_constructWriterFromConfig($writer);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(! $writer instanceof Zend_Log_Writer_Abstract) {
|
|
|
+ require_once 'Zend/Log/Exception.php';
|
|
|
+ throw new Zend_Log_Exception(
|
|
|
+ 'Writer must be an instance of Zend_Log_Writer_Abstract ' .
|
|
|
+ 'or you should pass a configuration array'
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
$this->_writers[] = $writer;
|
|
|
}
|
|
|
|