1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Log\Writer;
use DateTimeInterface;
use Mongo as MongoC;
use MongoClient;
use MongoCollection;
use MongoDate;
use Traversable;
use Zend\Log\Exception;
use Zend\Log\Formatter\FormatterInterface;
use Zend\Stdlib\ArrayUtils;
/**
* Mongo log writer.
*/
class Mongo extends AbstractWriter
{
/**
* MongoCollection instance
*
* @var MongoCollection
*/
protected $mongoCollection;
/**
* Options used for MongoCollection::save()
*
* @var array
*/
protected $saveOptions;
/**
* Constructor
*
* @param MongoC|MongoClient|array|Traversable $mongo
* @param string $database
* @param string $collection
* @param array $saveOptions
* @throws Exception\InvalidArgumentException
* @throws Exception\ExtensionNotLoadedException
*/
public function __construct($mongo, $database = null, $collection = null, array $saveOptions = [])
{
if (! extension_loaded('mongo')) {
throw new Exception\ExtensionNotLoadedException('Missing ext/mongo');
}
if ($mongo instanceof Traversable) {
// Configuration may be multi-dimensional due to save options
$mongo = ArrayUtils::iteratorToArray($mongo);
}
if (is_array($mongo)) {
parent::__construct($mongo);
$saveOptions = isset($mongo['save_options']) ? $mongo['save_options'] : [];
$collection = isset($mongo['collection']) ? $mongo['collection'] : null;
$database = isset($mongo['database']) ? $mongo['database'] : null;
$mongo = isset($mongo['mongo']) ? $mongo['mongo'] : null;
}
if (null === $collection) {
throw new Exception\InvalidArgumentException('The collection parameter cannot be empty');
}
if (null === $database) {
throw new Exception\InvalidArgumentException('The database parameter cannot be empty');
}
if (! ($mongo instanceof MongoClient || $mongo instanceof MongoC)) {
throw new Exception\InvalidArgumentException(sprintf(
'Parameter of type %s is invalid; must be MongoClient or Mongo',
(is_object($mongo) ? get_class($mongo) : gettype($mongo))
));
}
$this->mongoCollection = $mongo->selectCollection($database, $collection);
$this->saveOptions = $saveOptions;
}
/**
* This writer does not support formatting.
*
* @param string|FormatterInterface $formatter
* @param array|null $options (unused)
* @return WriterInterface
*/
public function setFormatter($formatter, array $options = null)
{
return $this;
}
/**
* Write a message to the log.
*
* @param array $event Event data
* @return void
* @throws Exception\RuntimeException
*/
protected function doWrite(array $event)
{
if (null === $this->mongoCollection) {
throw new Exception\RuntimeException('MongoCollection must be defined');
}
if (isset($event['timestamp']) && $event['timestamp'] instanceof DateTimeInterface) {
$event['timestamp'] = new MongoDate($event['timestamp']->getTimestamp());
}
$this->mongoCollection->save($event, $this->saveOptions);
}
}