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