Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 23 additions & 1 deletion DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,25 @@ public function getConfigTreeBuilder()
->booleanNode('stop_buffering')->defaultTrue()->end()// fingers_crossed
->scalarNode('buffer_size')->defaultValue(0)->end() // fingers_crossed and buffer
->scalarNode('handler')->end() // fingers_crossed and buffer
->scalarNode('publisher')->end() // gelf
->arrayNode('publisher')
->canBeUnset()
->beforeNormalization()
->ifString()
->then(function($v) { return array('id'=> $v); })
->end()
->children()
->scalarNode('id')->end()
->scalarNode('hostname')->end()
->scalarNode('port')->defaultValue(12201)->end()
->scalarNode('chunk_size')->defaultValue(1420)->end()
->end()
->validate()
->ifTrue(function($v) {
return !isset($v['id']) && !isset($v['hostname']);
})
->thenInvalid('What must be set is either the hostname or the id.')
->end()
->end() // gelf
->arrayNode('members') // group
->canBeUnset()
->performNoDeepMerging()
Expand Down Expand Up @@ -159,6 +177,10 @@ public function getConfigTreeBuilder()
->ifTrue(function($v) { return 'service' === $v['type'] && !isset($v['id']); })
->thenInvalid('The id has to be specified to use a service as handler')
->end()
->validate()
->ifTrue(function($v) { return 'gelf' === $v['type'] && !isset($v['publisher']); })
->thenInvalid('The publisher has to be specified to use a GelfHandler')
->end()
->end()
->validate()
->ifTrue(function($v) { return isset($v['debug']); })
Expand Down
16 changes: 15 additions & 1 deletion DependencyInjection/MonologExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,22 @@ private function buildHandler(ContainerBuilder $container, $name, array $handler
break;

case 'gelf':
if (isset($handler['publisher']['id'])) {
$publisherId = $handler['publisher']['id'];
} else {
$publisher = new Definition("%monolog.gelf.publisher.class%", array(
$handler['publisher']['hostname'],
$handler['publisher']['port'],
$handler['publisher']['chunk_size'],
));

$publisherId = 'monolog.gelf.publisher';
$publisher->setPublic(false);
$container->setDefinition($publisherId, $publisher);
}

$definition->setArguments(array(
new Reference($handler['publisher']),
new Reference($publisherId),
$handler['level'],
$handler['bubble'],
));
Expand Down
1 change: 1 addition & 0 deletions Resources/config/monolog.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

<parameters>
<parameter key="monolog.logger.class">Symfony\Bridge\Monolog\Logger</parameter>
<parameter key="monolog.gelf.publisher.class">Gelf\MessagePublisher</parameter>
<parameter key="monolog.handler.stream.class">Monolog\Handler\StreamHandler</parameter>
<parameter key="monolog.handler.group.class">Monolog\Handler\GroupHandler</parameter>
<parameter key="monolog.handler.buffer.class">Monolog\Handler\BufferHandler</parameter>
Expand Down
9 changes: 8 additions & 1 deletion Resources/config/schema/monolog-1.0.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
<xsd:element name="email-prototype" type="email-prototype" minOccurs="0" maxOccurs="1" />
<xsd:element name="member" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="channels" type="channels" minOccurs="0" maxOccurs="1" />
<xsd:element name="publisher" type="publisher" minOccurs="0" maxOccurs="1" />
</xsd:sequence>
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="priority" type="xsd:integer" />
Expand All @@ -32,7 +33,6 @@
<xsd:attribute name="buffer-size" type="xsd:integer" />
<xsd:attribute name="max-files" type="xsd:integer" />
<xsd:attribute name="handler" type="xsd:string" />
<xsd:attribute name="publisher" type="xsd:string" />
<xsd:attribute name="from-email" type="xsd:string" />
<xsd:attribute name="to-email" type="xsd:string" />
<xsd:attribute name="subject" type="xsd:string" />
Expand Down Expand Up @@ -64,6 +64,13 @@
</xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="publisher">
<xsd:attribute name="id" type="xsd:string" />
<xsd:attribute name="hostname" type="xsd:string" />
<xsd:attribute name="port" type="xsd:integer" />
<xsd:attribute name="chunk_size" type="xsd:integer" />
</xsd:complexType>

<xsd:complexType name="email-prototype">
<xsd:attribute name="id" type="xsd:string" />
<xsd:attribute name="method" type="xsd:string" />
Expand Down
45 changes: 41 additions & 4 deletions Tests/DependencyInjection/ConfigurationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,14 @@ public function testProcessSimpleCase()

$this->assertArrayHasKey('handlers', $config);
$this->assertArrayHasKey('foobar', $config['handlers']);
$this->assertEquals('stream', $config['handlers']['foobar']['type']);
$this->assertEquals('stream', $config['handlers']['foobar']['type']);
$this->assertEquals('/foo/bar', $config['handlers']['foobar']['path']);
}

public function provideProcessStringChannels()
{
return array(
array('foo', 'foo', true),
array('foo', 'foo', true),
array('!foo', 'foo', false)
);
}
Expand All @@ -53,8 +53,8 @@ public function testProcessStringChannels($string, $expectedString, $isInclusive
array(
'handlers' => array(
'foobar' => array(
'type' => 'stream',
'path' => '/foo/bar',
'type' => 'stream',
'path' => '/foo/bar',
'channels' => $string
)
)
Expand All @@ -68,6 +68,43 @@ public function testProcessStringChannels($string, $expectedString, $isInclusive
$this->assertEquals($expectedString, $config['handlers']['foobar']['channels']['elements'][0]);
}

public function provideGelfPublisher()
{
return array(
array(
'gelf.publisher'
),
array(
array(
'id' => 'gelf.publisher'
)
)
);
}

/**
* @dataProvider provideGelfPublisher
*/
public function testGelfPublisherService($publisher)
{
$configs = array(
array(
'handlers' => array(
'gelf' => array(
'type' => 'gelf',
'publisher' => $publisher,
),
)
)
);

$config = $this->process($configs);

$this->assertArrayHasKey('id', $config['handlers']['gelf']['publisher']);
$this->assertArrayNotHasKey('hostname', $config['handlers']['gelf']['publisher']);
$this->assertEquals('gelf.publisher', $config['handlers']['gelf']['publisher']['id']);
}

public function testArrays()
{
$configs = array(
Expand Down
22 changes: 22 additions & 0 deletions Tests/DependencyInjection/MonologExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,28 @@ public function testExceptionWhenUsingBufferWithoutHandler()
$loader->load(array(array('handlers' => array('main' => array('type' => 'buffer')))), $container);
}

/**
* @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
*/
public function testExceptionWhenUsingGelfWithoutPublisher()
{
$container = new ContainerBuilder();
$loader = new MonologExtension();

$loader->load(array(array('handlers' => array('gelf' => array('type' => 'gelf')))), $container);
}

/**
* @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
*/
public function testExceptionWhenUsingGelfWithoutPublisherHostname()
{
$container = new ContainerBuilder();
$loader = new MonologExtension();

$loader->load(array(array('handlers' => array('gelf' => array('type' => 'gelf', 'publisher' => array())))), $container);
}

/**
* @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
*/
Expand Down