Author: ihabunek
Date: Sun May 15 13:11:28 2011
New Revision: 1103366

URL: http://svn.apache.org/viewvc?rev=1103366&view=rev
Log:
Work on the MongoDB appender (original code provided by Vladimir Gorej)  :
* Added LoggerLoggingEventBsonifier helper class for constructing bson arrays 
as required by MongoDB appender.
* Adapted LoggerAppenderMongoDB to use the bsonifier helper instead of a layout.
* Removed LoggerLayoutBson since it is no longer used (maybe rework the code 
for a JSON appender later). 
* Adapted tests where needed.

Added:
    logging/log4php/trunk/src/main/php/helpers/LoggerLoggingEventBsonifier.php
    
logging/log4php/trunk/src/test/php/helpers/LoggerLoggingEventBsonifierTest.php
      - copied, changed from r1103330, 
logging/log4php/trunk/src/test/php/layouts/LoggerMongoDbBsonLayoutTest.php
Removed:
    logging/log4php/trunk/src/main/php/layouts/LoggerLayoutBson.php
    
logging/log4php/trunk/src/test/php/appenders/LoggerAppenderMongoDBLayoutTest.php
    logging/log4php/trunk/src/test/php/layouts/LoggerMongoDbBsonLayoutTest.php
Modified:
    logging/log4php/trunk/src/changes/changes.xml
    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/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/logging/log4php/trunk/src/changes/changes.xml?rev=1103366&r1=1103365&r2=1103366&view=diff
==============================================================================
--- logging/log4php/trunk/src/changes/changes.xml (original)
+++ logging/log4php/trunk/src/changes/changes.xml Sun May 15 13:11:28 2011
@@ -24,6 +24,7 @@
   </properties>
   <body>
        <release version="2.1" description="Stabilizing">
+               <action type="fix" issue="LOG4PHP-110" by="Vladimir Gorej, Ivan 
Habunek">Adapted MongoDB appender to better fit in log4php codebase.</action>
                <action type="fix" issue="LOG4PHP-126" by="Peter Chapman, 
Christian Grobmeier">LoggerConfiguratorPhp does not appear to respect appender 
file property from config</action>
                <action type="fix" issue="LOG4PHP-118" by="Craig 
Marvelley">Additivity cannot be disabled through log4php.properties ini 
file.</action>
                <action type="update" issue="LOG4PHP-110" by="Vladimir Gorej, 
Christian Grobmeier">Added MongoDB appender</action>

Modified: logging/log4php/trunk/src/main/php/Logger.php
URL: 
http://svn.apache.org/viewvc/logging/log4php/trunk/src/main/php/Logger.php?rev=1103366&r1=1103365&r2=1103366&view=diff
==============================================================================
--- logging/log4php/trunk/src/main/php/Logger.php (original)
+++ logging/log4php/trunk/src/main/php/Logger.php Sun May 15 13:11:28 2011
@@ -90,6 +90,7 @@ 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=1103366&r1=1103365&r2=1103366&view=diff
==============================================================================
--- logging/log4php/trunk/src/main/php/appenders/LoggerAppenderMongoDB.php 
(original)
+++ logging/log4php/trunk/src/main/php/appenders/LoggerAppenderMongoDB.php Sun 
May 15 13:11:28 2011
@@ -21,30 +21,6 @@
 /**
  * Appender for writing to MongoDB.
  * 
- *  Format of log event (for exception):
- *  {
- *  "_id": MongoId
- *  "timestamp": MongoDate,
- *  "level":"ERROR",
- *  "thread":"2556",
- *  "message":"testmessage",
- *  "loggerName":"testLogger",
- *  "fileName":"NA",
- *  "method":"getLocationInformation",
- *  "lineNumber":"NA",
- *  "className":"LoggerLoggingEvent",
- *  "exception":{
- *      "message":"exception2",
- *      "code":0,
- *      "stackTrace":"stackTrace of Exception",
- *      "innerException":{
- *          "message":"exception1",
- *          "code":0,
- *          "stackTrace":"stactTrace of inner Exception"
- *      }
- *  }
- *  } 
- * 
  * This class has been originally contributed from Vladimir Gorej 
  * (http://github.com/log4mongo/log4mongo-php).
  * 
@@ -61,28 +37,31 @@ class LoggerAppenderMongoDB extends Logg
        private static $DEFAULT_DB_NAME          = 'log4php_mongodb';
        private static $DEFAULT_COLLECTION_NAME  = 'logs';               
        
-       private $hostname;
-       private $port;
-       private $dbName;
-       private $collectionName;
+       protected $hostname;
+       protected $port;
+       protected $dbName;
+       protected $collectionName;
        
-       private $connection;
-       private $collection;
+       protected $connection;
+       protected $collection;
+       protected $bsonifier;
                
-       private $userName;
-       private $password;
+       protected $userName;
+       protected $password;
+       
+       protected $canAppend = false;
        
-       private $canAppend = false;
+       protected $requiresLayout = false;
                
        public function __construct($name = '') {
                parent::__construct($name);
                $this->hostname         = 
self::$DEFAULT_MONGO_URL_PREFIX.self::$DEFAULT_MONGO_HOST;
                $this->port             = self::$DEFAULT_MONGO_PORT;
                $this->dbName           = self::$DEFAULT_DB_NAME;
-               $this->collectionName   = self::$DEFAULT_COLLECTION_NAME;       
        
-               $this->requiresLayout   = false;
-               $this->setLayout(new LoggerLayoutBson());
+               $this->collectionName   = self::$DEFAULT_COLLECTION_NAME;
+               $this->bsonifier        = new LoggerLoggingEventBsonifier();
        }
+       
        /**
         * Setup db connection.
         * Based on defined options, this method connects to db defined in 
{@link $dbNmae}
@@ -112,24 +91,13 @@ class LoggerAppenderMongoDB extends Logg
        }                
        
        /**
-        * Set the Layout for this appender. Per default the LoggerLayoutBson
-        * is used as format. It can be overwritten with your own format using 
this
-        * setLayout method, even when a layout is not required.
-        * @see LoggerAppender::setLayout()
-        * @param LoggerLayout $layout
-        */
-       public function setLayout($layout) {
-                       $this->layout = $layout;
-       } 
-       
-       /**
         * Appends a new event to the mongo database.
         * 
         * @throws LoggerException      If the pattern conversion or the INSERT 
statement fails.
         */
        public function append(LoggerLoggingEvent $event) {
                if ($this->canAppend == true && $this->collection != null) {
-                       $document = (array) $this->getLayout()->format($event);
+                       $document = $this->bsonifier->bsonify($event);
                        $this->collection->insert($document);                   
                }                                
        }

Added: 
logging/log4php/trunk/src/main/php/helpers/LoggerLoggingEventBsonifier.php
URL: 
http://svn.apache.org/viewvc/logging/log4php/trunk/src/main/php/helpers/LoggerLoggingEventBsonifier.php?rev=1103366&view=auto
==============================================================================
--- logging/log4php/trunk/src/main/php/helpers/LoggerLoggingEventBsonifier.php 
(added)
+++ logging/log4php/trunk/src/main/php/helpers/LoggerLoggingEventBsonifier.php 
Sun May 15 13:11:28 2011
@@ -0,0 +1,104 @@
+<?php
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @package log4php
+ * @subpackage helpers
+ */
+
+/**
+ * Helper class used by MongoDB appender.
+ * 
+ * This class has been originally contributed from Vladimir Gorej 
+ * (http://github.com/log4mongo/log4mongo-php).
+ */
+class LoggerLoggingEventBsonifier 
+{
+       /**
+        * Bson-ify logging event into mongo bson
+        * 
+        * @param LoggerLoggingEvent $event
+        * @return array
+        */
+       public function bsonify(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() 
+               );      
+
+               $this->addLocationInformation($document, 
$event->getLocationInformation());
+               $this->addThrowableInformation($document, 
$event->getThrowableInformation());
+               
+               return $document;
+       }
+       
+       /**
+        * Adding, if exists, location information into bson document
+        * 
+        * @param array $document
+        * @param LoggerLocationInfo $locationInfo
+        */
+       protected function addLocationInformation(&$document, 
LoggerLocationInfo $locationInfo = null) {
+               if ($locationInfo != null) {
+                       $document['fileName']   = $locationInfo->getFileName();
+                       $document['method']     = 
$locationInfo->getMethodName();
+                       $document['lineNumber'] = 
($locationInfo->getLineNumber() == 'NA') ? 'NA' : (int) 
$locationInfo->getLineNumber();
+                       $document['className']  = $locationInfo->getClassName();
+               }               
+       }
+       
+       /**
+        * Adding, if exists, throwable information into bson document
+        * 
+        * @param array $document
+        * @param LoggerThrowableInformation $throwableInfo
+        */
+       protected function addThrowableInformation(&$document, 
LoggerThrowableInformation $throwableInfo = null) {
+               if ($throwableInfo != null) {
+                       $document['exception'] = 
$this->bsonifyThrowable($throwableInfo->getThrowable());
+               }
+       }
+       
+       /**
+        * Bson-ifying php native Exception object
+        * Support for innner exceptions
+        * 
+        * @param Exception $ex
+        * @return array
+        */
+       protected function bsonifyThrowable(Exception $ex) {
+               
+               $bsonException = array(                         
+                       'message'    => $ex->getMessage(),
+                       'code'       => $ex->getCode(),
+                       'stackTrace' => $ex->getTraceAsString(),
+               );
+                        
+               if (method_exists($ex, 'getPrevious') && $ex->getPrevious() !== 
null) {
+                       $bsonException['innerException'] = 
$this->bsonifyThrowable($ex->getPrevious());
+               }
+                       
+               return $bsonException;
+       }       
+}       
+
+?>
\ No newline at end of file

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=1103366&r1=1103365&r2=1103366&view=diff
==============================================================================
--- logging/log4php/trunk/src/test/php/appenders/LoggerAppenderMongoDBTest.php 
(original)
+++ logging/log4php/trunk/src/test/php/appenders/LoggerAppenderMongoDBTest.php 
Sun May 15 13:11:28 2011
@@ -19,7 +19,7 @@
  */
 
 /**
- * Testclass for the default layout.
+ * Testclass for the MongoDB appender.
  * 
  * This class has been originally contributed from Vladimir Gorej 
  * (http://github.com/log4mongo/log4mongo-php).
@@ -35,8 +35,8 @@ class LoggerAppenderMongoDBTest extends 
        protected static $event;
        
        public static function setUpBeforeClass() {
-               self::$appender         = new 
LoggerAppenderMongoDB('mongo_appender');
-               self::$event            = new 
LoggerLoggingEvent("LoggerAppenderMongoDBTest", new Logger("TEST"), 
LoggerLevel::getLevelError(), "testmessage");
+               self::$appender = new LoggerAppenderMongoDB('mongo_appender');
+               self::$event    = new 
LoggerLoggingEvent("LoggerAppenderMongoDBTest", new Logger("TEST"), 
LoggerLevel::getLevelError(), "testmessage");
        }
        
        public static function tearDownAfterClass() {

Copied: 
logging/log4php/trunk/src/test/php/helpers/LoggerLoggingEventBsonifierTest.php 
(from r1103330, 
logging/log4php/trunk/src/test/php/layouts/LoggerMongoDbBsonLayoutTest.php)
URL: 
http://svn.apache.org/viewvc/logging/log4php/trunk/src/test/php/helpers/LoggerLoggingEventBsonifierTest.php?p2=logging/log4php/trunk/src/test/php/helpers/LoggerLoggingEventBsonifierTest.php&p1=logging/log4php/trunk/src/test/php/layouts/LoggerMongoDbBsonLayoutTest.php&r1=1103330&r2=1103366&rev=1103366&view=diff
==============================================================================
--- logging/log4php/trunk/src/test/php/layouts/LoggerMongoDbBsonLayoutTest.php 
(original)
+++ 
logging/log4php/trunk/src/test/php/helpers/LoggerLoggingEventBsonifierTest.php 
Sun May 15 13:11:28 2011
@@ -29,29 +29,19 @@
  * @subpackage appenders
  * @since 2.1
  */
-class LoggerMongoDbBsonLayoutTest extends PHPUnit_Framework_TestCase {
+class LoggerLoggingEventBsonifierTest extends PHPUnit_Framework_TestCase {
        
        protected static $logger;
-       protected static $layout;
+       protected static $bsonifier;
        
        public static function setUpBeforeClass() {
-               self::$logger    = Logger::getLogger('test.Logger');
-               self::$layout    = new LoggerLayoutBson();
+               self::$logger = Logger::getLogger('test.Logger');
+               self::$bsonifier = new LoggerLoggingEventBsonifier();
        }       
        
        public static function tearDownAfterClass() {
                self::$logger  = null;
-               self::$layout  = null;
-       }
-       
-       public function testActivateOptions() {
-               $result = self::$layout->activateOptions();
-               $this->assertTrue($result);
-       }
-       
-       public function testgetContentType() {
-               $result = self::$layout->getContentType();
-               $this->assertEquals('application/bson', $result);
+               self::$bsonifier  = null;
        }
        
        public function testFormatSimple() {
@@ -61,7 +51,7 @@ class LoggerMongoDbBsonLayoutTest extend
                        LoggerLevel::getLevelWarn(),
                        'test message'
                );
-               $bsonifiedEvent = self::$layout->format($event);
+               $bsonifiedEvent = self::$bsonifier->bsonify($event);
                
                $this->assertEquals('WARN', $bsonifiedEvent['level']);
                $this->assertEquals('test message', $bsonifiedEvent['message']);
@@ -75,7 +65,7 @@ class LoggerMongoDbBsonLayoutTest extend
                        LoggerLevel::getLevelWarn(),
                        'test message'
                );
-               $bsonifiedEvent = self::$layout->format($event);
+               $bsonifiedEvent = self::$bsonifier->bsonify($event);
                
                $this->assertEquals('NA', $bsonifiedEvent['fileName']);         
                $this->assertEquals('getLocationInformation', 
$bsonifiedEvent['method']);
@@ -92,12 +82,12 @@ class LoggerMongoDbBsonLayoutTest extend
                        microtime(true),
                        new Exception('test exception', 1)
                );
-               $bsonifiedEvent = self::$layout->format($event);
+               $bsonifiedEvent = self::$bsonifier->bsonify($event);
                
-               $this->assertTrue(array_key_exists('exception', 
$bsonifiedEvent));
+               $this->assertArrayHasKey('exception', $bsonifiedEvent);
                $this->assertEquals(1, $bsonifiedEvent['exception']['code']);
                $this->assertEquals('test exception', 
$bsonifiedEvent['exception']['message']);
-               $this->assertContains('[internal function]: 
LoggerMongoDbBsonLayoutTest', $bsonifiedEvent['exception']['stackTrace']);
+               $this->assertContains('[internal function]: 
LoggerLoggingEventBsonifierTest', $bsonifiedEvent['exception']['stackTrace']);
        }
        
        public function testFormatThrowableInfoWithInnerException() {
@@ -109,13 +99,13 @@ class LoggerMongoDbBsonLayoutTest extend
                        microtime(true),
                        new Exception('test exeption', 1, new Exception('test 
exception inner', 2))
                );
-               $bsonifiedEvent = self::$layout->format($event);
+               $bsonifiedEvent = self::$bsonifier->bsonify($event);
 
                $this->assertTrue(array_key_exists('exception', 
$bsonifiedEvent));
                $this->assertTrue(array_key_exists('innerException', 
$bsonifiedEvent['exception']));
                $this->assertEquals(2, 
$bsonifiedEvent['exception']['innerException']['code']);
                $this->assertEquals('test exception inner', 
$bsonifiedEvent['exception']['innerException']['message']);
-               $this->assertContains('[internal function]: 
LoggerMongoDbBsonLayoutTest', $bsonifiedEvent['exception']['stackTrace']);      
    
+               $this->assertContains('[internal function]: 
LoggerLoggingEventBsonifierTest', $bsonifiedEvent['exception']['stackTrace']);  
            
        }       
        
        
@@ -126,7 +116,7 @@ class LoggerMongoDbBsonLayoutTest extend
                        LoggerLevel::getLevelWarn(),
                        'test message'
                );
-               $bsonifiedEvent = self::$layout->bsonify($event);
+               $bsonifiedEvent = self::$bsonifier->bsonify($event);
                
                $this->assertEquals('WARN', $bsonifiedEvent['level']);
                $this->assertEquals('test message', $bsonifiedEvent['message']);
@@ -140,7 +130,7 @@ class LoggerMongoDbBsonLayoutTest extend
                        LoggerLevel::getLevelWarn(),
                        'test message'
                );
-               $bsonifiedEvent = self::$layout->bsonify($event);
+               $bsonifiedEvent = self::$bsonifier->bsonify($event);
                
                $this->assertEquals('NA', $bsonifiedEvent['fileName']);         
                $this->assertEquals('getLocationInformation', 
$bsonifiedEvent['method']);
@@ -157,12 +147,12 @@ class LoggerMongoDbBsonLayoutTest extend
                        microtime(true),
                        new Exception('test exception', 1)
                );
-               $bsonifiedEvent = self::$layout->bsonify($event);
+               $bsonifiedEvent = self::$bsonifier->bsonify($event);
                
                $this->assertTrue(array_key_exists('exception', 
$bsonifiedEvent));
                $this->assertEquals(1, $bsonifiedEvent['exception']['code']);
                $this->assertEquals('test exception', 
$bsonifiedEvent['exception']['message']);
-               $this->assertContains('[internal function]: 
LoggerMongoDbBsonLayoutTest', $bsonifiedEvent['exception']['stackTrace']);
+               $this->assertContains('[internal function]: 
LoggerLoggingEventBsonifierTest', $bsonifiedEvent['exception']['stackTrace']);
        }
        
        public function testBsonifyThrowableInfoWithInnerException() {
@@ -174,13 +164,13 @@ class LoggerMongoDbBsonLayoutTest extend
                        microtime(true),
                        new Exception('test exeption', 1, new Exception('test 
exception inner', 2))
                );
-               $bsonifiedEvent = self::$layout->bsonify($event);
+               $bsonifiedEvent = self::$bsonifier->bsonify($event);
 
                $this->assertTrue(array_key_exists('exception', 
$bsonifiedEvent));
                $this->assertTrue(array_key_exists('innerException', 
$bsonifiedEvent['exception']));
                $this->assertEquals(2, 
$bsonifiedEvent['exception']['innerException']['code']);
                $this->assertEquals('test exception inner', 
$bsonifiedEvent['exception']['innerException']['message']);
-               $this->assertContains('[internal function]: 
LoggerMongoDbBsonLayoutTest', $bsonifiedEvent['exception']['stackTrace']);      
    
+               $this->assertContains('[internal function]: 
LoggerLoggingEventBsonifierTest', $bsonifiedEvent['exception']['stackTrace']);  
            
        }
 
        public function testIsThreadInteger() {
@@ -190,7 +180,7 @@ class LoggerMongoDbBsonLayoutTest extend
                 LoggerLevel::getLevelWarn(),
                 'test message'
         );
-        $bsonifiedEvent = self::$layout->bsonify($event);
+        $bsonifiedEvent = self::$bsonifier->bsonify($event);
                $this->assertTrue(is_int($bsonifiedEvent['thread']));
        }
 
@@ -201,7 +191,7 @@ class LoggerMongoDbBsonLayoutTest extend
                 LoggerLevel::getLevelWarn(),
                 'test message'
         );
-        $bsonifiedEvent = self::$layout->bsonify($event);
+        $bsonifiedEvent = self::$bsonifier->bsonify($event);
         $this->assertTrue(is_int($bsonifiedEvent['lineNumber']) || 
$bsonifiedEvent['lineNumber'] == 'NA');
     }
 
@@ -214,7 +204,7 @@ class LoggerMongoDbBsonLayoutTest extend
                 microtime(true),
                 new Exception('test exeption', 1, new Exception('test 
exception inner', 2))
         );
-        $bsonifiedEvent = self::$layout->bsonify($event);
+        $bsonifiedEvent = self::$bsonifier->bsonify($event);
         $this->assertTrue(is_int($bsonifiedEvent['exception']['code']));
     }
 }


Reply via email to