Author: ihabunek
Date: Sun Jun 19 21:13:04 2011
New Revision: 1137439

URL: http://svn.apache.org/viewvc?rev=1137439&view=rev
Log:
LOG4PHP-110: Further work on the mongodb appender
* Moved the conversion code from LoggerLoggingEventBsonifier to 
LoggerAppenderMongoDB::format()
* Removed the LoggerLoggingEventBsonifier
* Merged the tests from LoggerLoggingEventBsonifierTest into 
LoggerAppenderMongoDBTest

Removed:
    logging/log4php/trunk/src/main/php/helpers/LoggerLoggingEventBsonifier.php
    
logging/log4php/trunk/src/test/php/helpers/LoggerLoggingEventBsonifierTest.php
Modified:
    logging/log4php/trunk/src/main/php/Logger.php
    logging/log4php/trunk/src/main/php/appenders/LoggerAppenderMongoDB.php
    logging/log4php/trunk/src/test/php/appenders/LoggerAppenderMongoDBTest.php

Modified: logging/log4php/trunk/src/main/php/Logger.php
URL: 
http://svn.apache.org/viewvc/logging/log4php/trunk/src/main/php/Logger.php?rev=1137439&r1=1137438&r2=1137439&view=diff
==============================================================================
--- logging/log4php/trunk/src/main/php/Logger.php (original)
+++ logging/log4php/trunk/src/main/php/Logger.php Sun Jun 19 21:13:04 2011
@@ -84,7 +84,6 @@ class Logger {
                'LoggerDatePatternConverter' => 
'/helpers/LoggerDatePatternConverter.php',
                'LoggerLiteralPatternConverter' => 
'/helpers/LoggerLiteralPatternConverter.php',
                'LoggerLocationPatternConverter' => 
'/helpers/LoggerLocationPatternConverter.php',
-               'LoggerLoggingEventBsonifier' => 
'/helpers/LoggerLoggingEventBsonifier.php',
                'LoggerMDCPatternConverter' => 
'/helpers/LoggerMDCPatternConverter.php',
                'LoggerNamedPatternConverter' => 
'/helpers/LoggerNamedPatternConverter.php',
                'LoggerBasicPatternConverter' => 
'/helpers/LoggerBasicPatternConverter.php',

Modified: logging/log4php/trunk/src/main/php/appenders/LoggerAppenderMongoDB.php
URL: 
http://svn.apache.org/viewvc/logging/log4php/trunk/src/main/php/appenders/LoggerAppenderMongoDB.php?rev=1137439&r1=1137438&r2=1137439&view=diff
==============================================================================
--- logging/log4php/trunk/src/main/php/appenders/LoggerAppenderMongoDB.php 
(original)
+++ logging/log4php/trunk/src/main/php/appenders/LoggerAppenderMongoDB.php Sun 
Jun 19 21:13:04 2011
@@ -21,8 +21,10 @@
 /**
  * Appender for writing to MongoDB.
  * 
- * This class has been originally contributed from Vladimir Gorej 
- * (http://github.com/log4mongo/log4mongo-php).
+ * This class was originally contributed by Vladimir Gorej.
+ * 
+ * @link http://github.com/log4mongo/log4mongo-php Vladimir Gorej's original 
submission.
+ * @link http://www.mongodb.org/ MongoDB website.
  * 
  * @version $Revision: 806678 $
  * @package log4php
@@ -44,7 +46,6 @@ class LoggerAppenderMongoDB extends Logg
        
        protected $connection;
        protected $collection;
-       protected $bsonifier;
                
        protected $userName;
        protected $password;
@@ -59,7 +60,6 @@ class LoggerAppenderMongoDB extends Logg
                $this->port             = self::DEFAULT_MONGO_PORT;
                $this->dbName           = self::DEFAULT_DB_NAME;
                $this->collectionName   = self::DEFAULT_COLLECTION_NAME;
-               $this->bsonifier        = new LoggerLoggingEventBsonifier();
        }
        
        /**
@@ -97,9 +97,65 @@ class LoggerAppenderMongoDB extends Logg
         */
        public function append(LoggerLoggingEvent $event) {
                if ($this->canAppend == true && $this->collection != null) {
-                       $document = $this->bsonifier->bsonify($event);
+                       $document = $this->format($event);
                        $this->collection->insert($document);                   
-               }                                
+               }
+       }
+       
+       /**
+        * Converts the logging event into an array which can be logged to 
mongodb.
+        * 
+        * @param LoggerLoggingEvent $event
+        * @return array
+        */
+       protected function format(LoggerLoggingEvent $event) {
+               $timestampSec  = (int) $event->getTimestamp();
+               $timestampUsec = (int) (($event->getTimestamp() - 
$timestampSec) * 1000000);
+
+               $document = array(
+                       'timestamp'  => new MongoDate($timestampSec, 
$timestampUsec),
+                       'level'      => $event->getLevel()->toString(),
+                       'thread'     => (int) $event->getThreadName(),
+                       'message'    => $event->getMessage(),
+                       'loggerName' => $event->getLoggerName() 
+               );      
+
+               $locationInfo = $event->getLocationInformation();
+               if ($locationInfo != null) {
+                       $document['fileName']   = $locationInfo->getFileName();
+                       $document['method']     = 
$locationInfo->getMethodName();
+                       $document['lineNumber'] = 
($locationInfo->getLineNumber() == 'NA') ? 'NA' : (int) 
$locationInfo->getLineNumber();
+                       $document['className']  = $locationInfo->getClassName();
+               }       
+
+               $throwableInfo = $event->getThrowableInformation();
+               if ($throwableInfo != null) {
+                       $document['exception'] = 
$this->formatThrowable($throwableInfo->getThrowable());
+               }
+               
+               return $document;
+       }
+       
+       /**
+        * Converts an Exception into an array which can be logged to mongodb.
+        * 
+        * Supports innner exceptions (PHP >= 5.3)
+        * 
+        * @param Exception $ex
+        * @return array
+        */
+       protected function formatThrowable(Exception $ex) {
+               $array = array(                         
+                       'message'    => $ex->getMessage(),
+                       'code'       => $ex->getCode(),
+                       'stackTrace' => $ex->getTraceAsString(),
+               );
+                        
+               if (method_exists($ex, 'getPrevious') && $ex->getPrevious() !== 
null) {
+                       $array['innerException'] = 
$this->formatThrowable($ex->getPrevious());
+               }
+                       
+               return $array;
        }
                
        /**
@@ -114,12 +170,12 @@ class LoggerAppenderMongoDB extends Logg
                        }                                       
                        $this->closed = true;
                }
-       }                
+       }
                
        public function __destruct() {
                $this->close();
        }
-               
+       
        public function setHost($hostname) {
                if (!preg_match('/^mongodb\:\/\//', $hostname)) {
                        $hostname = self::DEFAULT_MONGO_URL_PREFIX.$hostname;

Modified: 
logging/log4php/trunk/src/test/php/appenders/LoggerAppenderMongoDBTest.php
URL: 
http://svn.apache.org/viewvc/logging/log4php/trunk/src/test/php/appenders/LoggerAppenderMongoDBTest.php?rev=1137439&r1=1137438&r2=1137439&view=diff
==============================================================================
--- logging/log4php/trunk/src/test/php/appenders/LoggerAppenderMongoDBTest.php 
(original)
+++ logging/log4php/trunk/src/test/php/appenders/LoggerAppenderMongoDBTest.php 
Sun Jun 19 21:13:04 2011
@@ -38,7 +38,7 @@ class LoggerAppenderMongoDBTest extends 
        
        public static function setUpBeforeClass() {
                self::$appender = new LoggerAppenderMongoDB('mongo_appender');
-               self::$event    = new 
LoggerLoggingEvent("LoggerAppenderMongoDBTest", new Logger("TEST"), 
LoggerLevel::getLevelError(), "testmessage");
+               self::$event = new 
LoggerLoggingEvent("LoggerAppenderMongoDBTest", new Logger("test.Logger"), 
LoggerLevel::getLevelError(), "testmessage");
        }
        
        public static function tearDownAfterClass() {
@@ -158,49 +158,83 @@ class LoggerAppenderMongoDBTest extends 
                self::$appender->append(self::$event);
        }
        
-       public function testMongoDB() {
-               self::$appender->activateOptions();             
-               $mongo  = self::$appender->getConnection();
-               $db     = $mongo->selectDB('log4php_mongodb');
-               $db->drop('logs');              
-               $collection = $db->selectCollection('logs');
-                               
-               self::$appender->append(self::$event);
-
-               $this->assertNotEquals(null, $collection->findOne(), 
'Collection should return one record');
-       } 
-
-       public function testMongoDBException() {
-               self::$appender->activateOptions();             
-               $mongo  = self::$appender->getConnection();
-               $db             = $mongo->selectDB('log4php_mongodb');
-               $db->drop('logs');                              
-               $collection = $db->selectCollection('logs');
-                       
-               $throwable = new Exception('exception1');
-                                                               
-               self::$appender->append(new 
LoggerLoggingEvent("LoggerAppenderMongoDBTest", new Logger("TEST"), 
LoggerLevel::getLevelError(), "testmessage", microtime(true), $throwable));     
                         
+       public function testFormat() {
+               $record = $this->logOne(self::$event);
                
-               $this->assertNotEquals(null, $collection->findOne(), 
'Collection should return one record');
-       }               
+               $this->assertEquals('ERROR', $record['level']);
+               $this->assertEquals('testmessage', $record['message']);
+               $this->assertEquals('test.Logger', $record['loggerName']);
                
-       public function testMongoDBInnerException() {
-               self::$appender->activateOptions();
-               $mongo  = self::$appender->getConnection();
-               $db             = $mongo->selectDB('log4php_mongodb');
-               $db->drop('logs');                              
-               $collection = $db->selectCollection('logs');
-                               
-               $throwable1 = new Exception('exception1');
-               $throwable2 = new Exception('exception2', 0, $throwable1);
-                                                               
-               self::$appender->append(new 
LoggerLoggingEvent("LoggerAppenderMongoDBTest", new Logger("TEST"), 
LoggerLevel::getLevelError(), "testmessage", microtime(true), $throwable2));    
                        
+               $this->assertEquals('NA', $record['fileName']);         
+               $this->assertEquals('getLocationInformation', 
$record['method']);
+               $this->assertEquals('NA', $record['lineNumber']);
+               $this->assertEquals('LoggerLoggingEvent', $record['className']);
                
-               $this->assertNotEquals(null, $collection->findOne(), 
'Collection should return one record');
+               $this->assertTrue(is_int($record['thread']));
+               $this->assertTrue(is_int($record['lineNumber']) || 
$record['lineNumber'] == 'NA');
+       }
+       
+       public function testFormatThrowableInfo() {
+               $event = new LoggerLoggingEvent(
+                       'testFqcn',
+                       new Logger('test.Logger'),
+                       LoggerLevel::getLevelWarn(),
+                       'test message',
+                       microtime(true),
+                       new Exception('test exception', 1)
+               );
+               
+               $record = $this->logOne($event);
+               
+               $this->assertArrayHasKey('exception', $record);
+               $this->assertEquals(1, $record['exception']['code']);
+               $this->assertEquals('test exception', 
$record['exception']['message']);
+               $this->assertContains('[internal function]: 
LoggerAppenderMongoDBTest', $record['exception']['stackTrace']);
+       }
+       
+       public function testFormatThrowableInfoWithInnerException() {
+               $event = new LoggerLoggingEvent(
+                       'testFqcn',
+                       new Logger('test.Logger'),
+                       LoggerLevel::getLevelWarn(),
+                       'test message',
+                       microtime(true),
+                       new Exception('test exception', 1, new Exception('test 
exception inner', 2))
+               );
+               
+               $record = $this->logOne($event);
+
+               $this->assertArrayHasKey('exception', $record);
+               $this->assertEquals(1, $record['exception']['code']);
+               $this->assertEquals('test exception', 
$record['exception']['message']);
+               $this->assertContains('[internal function]: 
LoggerAppenderMongoDBTest', $record['exception']['stackTrace']);
+               
+               $this->assertTrue(array_key_exists('innerException', 
$record['exception']));
+               $this->assertEquals(2, 
$record['exception']['innerException']['code']);
+               $this->assertEquals('test exception inner', 
$record['exception']['innerException']['message']);
        }
        
        public function testClose() {
                self::$appender->close();
        }
+       
+       /** Logs the event and returns the record from the database. */
+       private function logOne($event)
+       {
+               self::$appender->activateOptions();
+               $mongo = self::$appender->getConnection();
+               $collection = $mongo->log4php_mongodb->logs;
+               
+               $result = $collection->drop();
+               self::assertSame((float) 1, $result['ok'], "Could not clear the 
collection before logging.");
+               
+               self::$appender->append($event);
+               
+               $record = $collection->findOne();
+               self::assertNotNull($record, "Could not read the record from 
the database.");
+               
+               return $record;
+       }
+       
 }
 ?>
\ No newline at end of file


Reply via email to