Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
86.36% |
19 / 22 |
CRAP | |
84.21% |
80 / 95 |
LoggerAppenderMongoDB | |
0.00% |
0 / 1 |
|
86.36% |
19 / 22 |
43.68 | |
84.21% |
80 / 95 |
__construct($name = '') | |
100.00% |
1 / 1 |
1 | |
100.00% |
8 / 8 |
|||
activateOptions() | |
0.00% |
0 / 1 |
21.52 | |
33.33% |
6 / 18 |
|||
append(LoggerLoggingEvent $event) | |
0.00% |
0 / 1 |
3.04 | |
83.33% |
5 / 6 |
|||
format(LoggerLoggingEvent $event) | |
100.00% |
1 / 1 |
4 | |
100.00% |
20 / 20 |
|||
formatThrowable(Exception $ex) | |
100.00% |
1 / 1 |
3 | |
100.00% |
8 / 8 |
|||
close() | |
100.00% |
1 / 1 |
3 | |
100.00% |
9 / 9 |
|||
setHost($host) | |
0.00% |
0 / 1 |
2.26 | |
60.00% |
3 / 5 |
|||
getHost() | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setPort($port) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getPort() | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setDatabaseName($databaseName) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getDatabaseName() | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setCollectionName($collectionName) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getCollectionName() | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setUserName($userName) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getUserName() | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setPassword($password) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getPassword() | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setTimeout($timeout) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getTimeout() | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
getConnection() | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
getCollection() | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
<?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. | |
*/ | |
/** | |
* Appender for writing to MongoDB. | |
* | |
* This class was originally contributed by Vladimir Gorej. | |
* | |
* ## Configurable parameters: ## | |
* | |
* - **host** - Server on which mongodb instance is located. | |
* - **port** - Port on which the instance is bound. | |
* - **databaseName** - Name of the database to which to log. | |
* - **collectionName** - Name of the target collection within the given database. | |
* - **username** - Username used to connect to the database. | |
* - **password** - Password used to connect to the database. | |
* - **timeout** - For how long the driver should try to connect to the database (in milliseconds). | |
* | |
* @version $Revision: 1346363 $ | |
* @package log4php | |
* @subpackage appenders | |
* @since 2.1 | |
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 | |
* @link http://logging.apache.org/log4php/docs/appenders/mongodb.html Appender documentation | |
* @link http://github.com/log4mongo/log4mongo-php Vladimir Gorej's original submission. | |
* @link http://www.mongodb.org/ MongoDB website. | |
*/ | |
class LoggerAppenderMongoDB extends LoggerAppender { | |
// ****************************************** | |
// ** Constants ** | |
// ****************************************** | |
/** Default prefix for the {@link $host}. */ | |
const DEFAULT_MONGO_URL_PREFIX = 'mongodb://'; | |
/** Default value for {@link $host}, without a prefix. */ | |
const DEFAULT_MONGO_HOST = 'localhost'; | |
/** Default value for {@link $port} */ | |
const DEFAULT_MONGO_PORT = 27017; | |
/** Default value for {@link $databaseName} */ | |
const DEFAULT_DB_NAME = 'log4php_mongodb'; | |
/** Default value for {@link $collectionName} */ | |
const DEFAULT_COLLECTION_NAME = 'logs'; | |
/** Default value for {@link $timeout} */ | |
const DEFAULT_TIMEOUT_VALUE = 3000; | |
// ****************************************** | |
// ** Configurable parameters ** | |
// ****************************************** | |
/** Server on which mongodb instance is located. */ | |
protected $host; | |
/** Port on which the instance is bound. */ | |
protected $port; | |
/** Name of the database to which to log. */ | |
protected $databaseName; | |
/** Name of the collection within the given database. */ | |
protected $collectionName; | |
/** Username used to connect to the database. */ | |
protected $userName; | |
/** Password used to connect to the database. */ | |
protected $password; | |
/** Timeout value used when connecting to the database (in milliseconds). */ | |
protected $timeout; | |
// ****************************************** | |
// ** Member variables ** | |
// ****************************************** | |
/** | |
* Connection to the MongoDB instance. | |
* @var Mongo | |
*/ | |
protected $connection; | |
/** | |
* The collection to which log is written. | |
* @var MongoCollection | |
*/ | |
protected $collection; | |
public function __construct($name = '') { | |
parent::__construct($name); | |
$this->host = self::DEFAULT_MONGO_URL_PREFIX . self::DEFAULT_MONGO_HOST; | |
$this->port = self::DEFAULT_MONGO_PORT; | |
$this->databaseName = self::DEFAULT_DB_NAME; | |
$this->collectionName = self::DEFAULT_COLLECTION_NAME; | |
$this->timeout = self::DEFAULT_TIMEOUT_VALUE; | |
$this->requiresLayout = false; | |
} | |
/** | |
* Setup db connection. | |
* Based on defined options, this method connects to the database and | |
* creates a {@link $collection}. | |
*/ | |
public function activateOptions() { | |
try { | |
$this->connection = new Mongo(sprintf('%s:%d', $this->host, $this->port), array('timeout' => $this->timeout)); | |
$db = $this->connection->selectDB($this->databaseName); | |
if ($this->userName !== null && $this->password !== null) { | |
$authResult = $db->authenticate($this->userName, $this->password); | |
if ($authResult['ok'] == floatval(0)) { | |
throw new Exception($authResult['errmsg'], $authResult['ok']); | |
} | |
} | |
$this->collection = $db->selectCollection($this->collectionName); | |
} catch (MongoConnectionException $ex) { | |
$this->closed = true; | |
$this->warn(sprintf('Failed to connect to mongo deamon: %s', $ex->getMessage())); | |
} catch (InvalidArgumentException $ex) { | |
$this->closed = true; | |
$this->warn(sprintf('Error while selecting mongo database: %s', $ex->getMessage())); | |
} catch (Exception $ex) { | |
$this->closed = true; | |
$this->warn('Invalid credentials for mongo database authentication'); | |
} | |
} | |
/** | |
* Appends a new event to the mongo database. | |
* | |
* @param LoggerLoggingEvent $event | |
*/ | |
public function append(LoggerLoggingEvent $event) { | |
try { | |
if ($this->collection != null) { | |
$this->collection->insert($this->format($event)); | |
} | |
} catch (MongoCursorException $ex) { | |
$this->warn(sprintf('Error while writing to mongo collection: %s', $ex->getMessage())); | |
} | |
} | |
/** | |
* Converts the logging event into an array which can be logged to mongodb. | |
* | |
* @param LoggerLoggingEvent $event | |
* @return array The array representation of the logging event. | |
*/ | |
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; | |
} | |
/** | |
* Closes the connection to the logging database | |
*/ | |
public function close() { | |
if($this->closed != true) { | |
$this->collection = null; | |
if ($this->connection !== null) { | |
$this->connection->close(); | |
$this->connection = null; | |
} | |
$this->closed = true; | |
} | |
} | |
/** | |
* Sets the value of {@link $host} parameter. | |
* @param string $host | |
*/ | |
public function setHost($host) { | |
if (!preg_match('/^mongodb\:\/\//', $host)) { | |
$host = self::DEFAULT_MONGO_URL_PREFIX . $host; | |
} | |
$this->host = $host; | |
} | |
/** | |
* Returns the value of {@link $host} parameter. | |
* @return string | |
*/ | |
public function getHost() { | |
return $this->host; | |
} | |
/** | |
* Sets the value of {@link $port} parameter. | |
* @param int $port | |
*/ | |
public function setPort($port) { | |
$this->setPositiveInteger('port', $port); | |
} | |
/** | |
* Returns the value of {@link $port} parameter. | |
* @return int | |
*/ | |
public function getPort() { | |
return $this->port; | |
} | |
/** | |
* Sets the value of {@link $databaseName} parameter. | |
* @param string $databaseName | |
*/ | |
public function setDatabaseName($databaseName) { | |
$this->setString('databaseName', $databaseName); | |
} | |
/** | |
* Returns the value of {@link $databaseName} parameter. | |
* @return string | |
*/ | |
public function getDatabaseName() { | |
return $this->databaseName; | |
} | |
/** | |
* Sets the value of {@link $collectionName} parameter. | |
* @param string $collectionName | |
*/ | |
public function setCollectionName($collectionName) { | |
$this->setString('collectionName', $collectionName); | |
} | |
/** | |
* Returns the value of {@link $collectionName} parameter. | |
* @return string | |
*/ | |
public function getCollectionName() { | |
return $this->collectionName; | |
} | |
/** | |
* Sets the value of {@link $userName} parameter. | |
* @param string $userName | |
*/ | |
public function setUserName($userName) { | |
$this->setString('userName', $userName, true); | |
} | |
/** | |
* Returns the value of {@link $userName} parameter. | |
* @return string | |
*/ | |
public function getUserName() { | |
return $this->userName; | |
} | |
/** | |
* Sets the value of {@link $password} parameter. | |
* @param string $password | |
*/ | |
public function setPassword($password) { | |
$this->setString('password', $password, true); | |
} | |
/** | |
* Returns the value of {@link $password} parameter. | |
* @return string | |
*/ | |
public function getPassword() { | |
return $this->password; | |
} | |
/** | |
* Sets the value of {@link $timeout} parameter. | |
* @param int $timeout | |
*/ | |
public function setTimeout($timeout) { | |
$this->setPositiveInteger('timeout', $timeout); | |
} | |
/** | |
* Returns the value of {@link $timeout} parameter. | |
* @return int | |
*/ | |
public function getTimeout() { | |
return $this->timeout; | |
} | |
/** | |
* Returns the mongodb connection. | |
* @return Mongo | |
*/ | |
public function getConnection() { | |
return $this->connection; | |
} | |
/** | |
* Returns the active mongodb collection. | |
* @return MongoCollection | |
*/ | |
public function getCollection() { | |
return $this->collection; | |
} | |
} |