/**
  * This method must work for the root category as well.
  *
  * @param array $props array of properties
  * @param Logger $logger
  * @param string $optionKey
  * @param string $loggerName
  * @param string $value
  * @return Logger
  */
 private function parseCategory($props, Logger $logger, $optionKey, $loggerName, $value)
 {
     // We must skip over ',' but not white space
     $st = explode(',', $value);
     // If value is not in the form ", appender.." or "", then we should set
     // the level of the loggeregory.
     if (!(empty($value) || @$value[0] == ',')) {
         // just to be on the safe side...
         if (count($st) == 0) {
             return;
         }
         $levelStr = current($st);
         // If the level value is inherited, set category level value to
         // null. We also check that the user has not specified inherited for the
         // root category.
         if ('INHERITED' == strtoupper($levelStr) || 'NULL' == strtoupper($levelStr)) {
             if ($loggerName == self::INTERNAL_ROOT_NAME) {
                 // TODO: throw exception?	"The root logger cannot be set to null."
             } else {
                 $logger->setLevel(null);
             }
         } else {
             $logger->setLevel(LoggerOptionConverter::toLevel($levelStr, LoggerLevel::getLevelDebug()));
         }
     }
     // TODO: removing should be done by the logger, if necessary and wanted
     // $logger->removeAllAppenders();
     while ($appenderName = next($st)) {
         $appenderName = trim($appenderName);
         if (empty($appenderName)) {
             continue;
         }
         $appender = $this->parseAppender($props, $appenderName);
         if ($appender !== null) {
             $logger->addAppender($appender);
         }
     }
 }
 /**
  * Configures a logger. 
  * 
  * @param Logger $logger The logger to configure
  * @param array $config Logger configuration options.
  */
 private function configureLogger(Logger $logger, $config)
 {
     $loggerName = $logger->getName();
     // Set logger level
     if (isset($config['level'])) {
         $level = LoggerLevel::toLevel($config['level']);
         if (isset($level)) {
             $logger->setLevel($level);
         } else {
             $default = $logger->getLevel();
             $this->warn("Invalid level value [{$config['level']}] specified for logger [{$loggerName}]. Ignoring level definition.");
         }
     }
     // Link appenders to logger
     if (isset($config['appenders'])) {
         foreach ($config['appenders'] as $appenderName) {
             if (isset($this->appenders[$appenderName])) {
                 $logger->addAppender($this->appenders[$appenderName]);
             } else {
                 $this->warn("Nonexistnant appender [{$appenderName}] linked to logger [{$loggerName}].");
             }
         }
     }
     // Set logger additivity
     if (isset($config['additivity'])) {
         $additivity = LoggerOptionConverter::toBoolean($config['additivity'], null);
         if (is_bool($additivity)) {
             $logger->setAdditivity($additivity);
         } else {
             $this->warn("Invalid additivity value [{$config['additivity']}] specified for logger [{$loggerName}]. Ignoring additivity setting.");
         }
     }
 }
 /**
  * It executes the bucket and logs its status 
  * 
  * @param ForgeUpgrade_Bucket  $bucket
  * @param Logger               $log
  */
 public function runUpBucket($bucket, $log)
 {
     $this->db->logStart($bucket);
     // Prepare a specific logger that will be used to store all
     // Bucket traces into the database so the buckets and it's logs
     // will be linked
     $bucketAppender = $this->dbDriver->getBucketLoggerAppender($bucket);
     $log->addAppender($bucketAppender);
     $bucket->setLoggerParent($log);
     $log->info("Processing " . get_class($bucket));
     if (!$this->options['core']['ignore_preup']) {
         $bucket->preUp();
         $log->info("PreUp OK");
     }
     $bucket->up();
     $log->info("Up OK");
     $bucket->postUp();
     $log->info("PostUp OK");
     $this->db->logEnd($bucket, ForgeUpgrade_Db::STATUS_SUCCESS);
     $log->removeAppender($bucketAppender);
 }
 public function testMaxLevel()
 {
     $logger = new Logger('root');
     $appender = new LoggerAppenderTest();
     $logger->addAppender($appender);
     $logger->log(Logger::INFO, 1);
     $this->assertEquals(array(array(Logger::INFO, 1)), $appender->logs);
     $logger->setMaxLevel(Logger::INFO);
     $logger->log(Logger::INFO, 2);
     $logger->log(Logger::FATAL, 3);
     $logger->log(Logger::DEBUG, 4);
     $this->assertEquals(array(array(Logger::INFO, 1), array(Logger::INFO, 2), array(Logger::DEBUG, 4)), $appender->logs);
     return;
 }
 /**
  * @private
  * Loads the configuration from the config file
  */
 function _loadLoggerConfig()
 {
     // load the config file and see how many loggers are configued
     $config = new LoggerConfigLoader();
     $loggers = $config->getConfiguredLoggers();
     if (count($loggers) == 0) {
         // add a default logger
         $loggers["default"] = array("layout" => "%d %N - [%f:%l (%c:%F)] %m%n", "appender" => "stdout", "prio" => "debug");
     }
     // loop through the loggers and configure them
     foreach ($config->getConfiguredLoggers() as $logger) {
         // get the logger config properties
         $properties = $config->getLoggerProperties($logger);
         // create the logger
         $layout = new PatternLayout($config->getLoggerLayout($logger));
         $appenderObject = $this->createAppenderInstance($config->getLoggerAppender($logger), $layout, $properties);
         // create the logger, set the appender and it to the list
         $loggerObject = new Logger($properties);
         $loggerObject->addAppender($appenderObject);
         $this->addLogger($logger, $loggerObject);
     }
 }