-
-
Notifications
You must be signed in to change notification settings - Fork 239
Add support for configuring Gelf encoders in Monolog configuration #492
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: 4.x
Are you sure you want to change the base?
Changes from 2 commits
fba862a
e0a7656
9ec2b46
ff5cf01
5a5eb67
0297541
760ee0d
ab5a00a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -50,7 +50,12 @@ | |
* - [bubble]: bool, defaults to true | ||
* | ||
* - gelf: | ||
* - publisher: {id: ...} or {hostname: ..., port: ..., chunk_size: ...} | ||
* - publiser: | ||
* - id: string, service id of a publisher implementation, optional if hostname is given | ||
* - hostname: string, optional if id is given | ||
* - [port]: int, defaults to 12201 | ||
* - [chunk_size]: int, defaults to 1420 | ||
* - [encoder]: string, its value can be 'json' or 'compressed_json' | ||
|
||
* - [level]: level name or int value, defaults to DEBUG | ||
* - [bubble]: bool, defaults to true | ||
* | ||
|
@@ -816,6 +821,7 @@ private function addGelfSection(ArrayNodeDefinition $handerNode) | |
->scalarNode('hostname')->end() | ||
->scalarNode('port')->defaultValue(12201)->end() | ||
->scalarNode('chunk_size')->defaultValue(1420)->end() | ||
->scalarNode('encoder')->end() | ||
Tib-z marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
->end() | ||
->validate() | ||
->ifTrue(function ($v) { | ||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -24,6 +24,7 @@ | |||||
use Symfony\Bridge\Monolog\Processor\SwitchUserTokenProcessor; | ||||||
use Symfony\Bridge\Monolog\Processor\TokenProcessor; | ||||||
use Symfony\Bridge\Monolog\Processor\WebProcessor; | ||||||
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; | ||||||
use Symfony\Component\Config\FileLocator; | ||||||
use Symfony\Component\DependencyInjection\Argument\BoundArgument; | ||||||
use Symfony\Component\DependencyInjection\ChildDefinition; | ||||||
|
@@ -227,10 +228,28 @@ private function buildHandler(ContainerBuilder $container, $name, array $handler | |||||
]); | ||||||
$transport->setPublic(false); | ||||||
|
||||||
if (isset($handler['publisher']['encoder'])) { | ||||||
if ('compressed_json' === $handler['publisher']['encoder']) { | ||||||
$encoderClass = 'Gelf\Encoder\CompressedJsonEncoder'; | ||||||
} elseif ('json' === $handler['publisher']['encoder']) { | ||||||
$encoderClass = 'Gelf\Encoder\JsonEncoder'; | ||||||
} else { | ||||||
throw new InvalidConfigurationException('The gelf message encoder must be either "compressed_json" or "json".'); | ||||||
Tib-z marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
} | ||||||
|
||||||
$encoder = new Definition($encoderClass); | ||||||
$encoder->setPublic(false); | ||||||
|
||||||
$transport->addMethodCall('setMessageEncoder', [$encoder]); | ||||||
} | ||||||
|
||||||
$publisher = new Definition('Gelf\Publisher', []); | ||||||
$publisher->addMethodCall('addTransport', [$transport]); | ||||||
$publisher->setPublic(false); | ||||||
} elseif (class_exists('Gelf\MessagePublisher')) { | ||||||
if (isset($handler['publisher']['encoder']) && 'compressed_json' !== $handler['publisher']['encoder']) { | ||||||
throw new InvalidConfigurationException('The Gelf\MessagePublisher publisher supports only the compressed json encoding. Omit the option to use the default encoding or use "compressed_json" as the encoder option.'); | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
} | ||||||
$publisher = new Definition('Gelf\MessagePublisher', [ | ||||||
$handler['publisher']['hostname'], | ||||||
$handler['publisher']['port'], | ||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
<?php | ||
|
||
/* | ||
* This file is part of the Symfony package. | ||
* | ||
* (c) Fabien Potencier <[email protected]> | ||
* | ||
* For the full copyright and license information, please view the LICENSE | ||
* file that was distributed with this source code. | ||
*/ | ||
|
||
namespace Symfony\Bundle\MonologBundle\Tests\DependencyInjection\Fixtures; | ||
|
||
class DummyClassForClassExistsCheck | ||
{ | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -22,6 +22,7 @@ | |
use Symfony\Bundle\MonologBundle\Tests\DependencyInjection\Fixtures\AsMonologProcessor\FooProcessor; | ||
use Symfony\Bundle\MonologBundle\Tests\DependencyInjection\Fixtures\AsMonologProcessor\FooProcessorWithPriority; | ||
use Symfony\Bundle\MonologBundle\Tests\DependencyInjection\Fixtures\AsMonologProcessor\RedeclareMethodProcessor; | ||
use Symfony\Bundle\MonologBundle\Tests\DependencyInjection\Fixtures\DummyClassForClassExistsCheck; | ||
use Symfony\Bundle\MonologBundle\Tests\DependencyInjection\Fixtures\ServiceWithChannel; | ||
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; | ||
use Symfony\Component\DependencyInjection\ContainerBuilder; | ||
|
@@ -186,6 +187,97 @@ public function testExceptionWhenUsingGelfWithoutPublisherHostname() | |
$loader->load([['handlers' => ['gelf' => ['type' => 'gelf', 'publisher' => []]]]], $container); | ||
} | ||
|
||
public function testExceptionWhenUsingLegacyGelfImplementationWithUnsupportedEncoder(): void | ||
{ | ||
if (!class_exists('Gelf\MessagePublisher')) { | ||
class_alias(DummyClassForClassExistsCheck::class, 'Gelf\MessagePublisher'); | ||
|
||
} | ||
|
||
$container = new ContainerBuilder(); | ||
$loader = new MonologExtension(); | ||
|
||
$this->expectException(InvalidConfigurationException::class); | ||
|
||
$loader->load([['handlers' => ['gelf' => ['type' => 'gelf', 'publisher' => ['hostname' => 'localhost', 'encoder' => 'json']]]]], $container); | ||
} | ||
|
||
/** | ||
* @dataProvider encoderOptionsProvider | ||
*/ | ||
public function testLegacyGelfImplementationEncoderOption(array $config): void | ||
{ | ||
if (!class_exists('Gelf\MessagePublisher')) { | ||
class_alias(DummyClassForClassExistsCheck::class, 'Gelf\MessagePublisher'); | ||
} | ||
|
||
$container = $this->getContainer($config); | ||
$this->assertTrue($container->hasDefinition('monolog.handler.gelf')); | ||
|
||
$handler = $container->getDefinition('monolog.handler.gelf'); | ||
/** @var Definition $publisher */ | ||
$publisher = $handler->getArguments()[0]; | ||
|
||
$this->assertDICConstructorArguments($publisher, ['localhost', 12201, 1420]); | ||
} | ||
|
||
public function encoderOptionsProvider(): array | ||
{ | ||
return [ | ||
[ | ||
[['handlers' => ['gelf' => ['type' => 'gelf', 'publisher' => ['hostname' => 'localhost', 'encoder' => 'compressed_json']]]]], | ||
], | ||
[ | ||
[['handlers' => ['gelf' => ['type' => 'gelf', 'publisher' => ['hostname' => 'localhost']]]]], | ||
], | ||
]; | ||
} | ||
|
||
public function testExceptionWhenUsingGelfWithInvalidEncoder(): void | ||
{ | ||
if (!class_exists('Gelf\Transport\UdpTransport')) { | ||
class_alias(DummyClassForClassExistsCheck::class, 'Gelf\Transport\UdpTransport'); | ||
} | ||
|
||
$container = new ContainerBuilder(); | ||
$loader = new MonologExtension(); | ||
|
||
$this->expectException(InvalidConfigurationException::class); | ||
|
||
$loader->load([['handlers' => ['gelf' => ['type' => 'gelf', 'publisher' => ['hostname' => 'localhost', 'encoder' => 'invalid_encoder']]]]], $container); | ||
} | ||
|
||
/** | ||
* @dataProvider gelfEncoderProvider | ||
*/ | ||
public function testGelfWithEncoder($encoderValue, $expectedClass): void | ||
{ | ||
if (!class_exists('Gelf\Transport\UdpTransport')) { | ||
class_alias(DummyClassForClassExistsCheck::class, 'Gelf\Transport\UdpTransport'); | ||
} | ||
|
||
$container = $this->getContainer([['handlers' => ['gelf' => ['type' => 'gelf', 'publisher' => ['hostname' => 'localhost', 'encoder' => $encoderValue]]]]]); | ||
$this->assertTrue($container->hasDefinition('monolog.handler.gelf')); | ||
|
||
$handler = $container->getDefinition('monolog.handler.gelf'); | ||
/** @var Definition $publisher */ | ||
$publisher = $handler->getArguments()[0]; | ||
/** @var Definition $transport */ | ||
$transport = $publisher->getMethodCalls()[0][1][0]; | ||
$encoder = $transport->getMethodCalls()[0][1][0]; | ||
|
||
$this->assertDICConstructorArguments($transport, ['localhost', 12201, 1420]); | ||
$this->assertDICDefinitionClass($encoder, $expectedClass); | ||
$this->assertDICConstructorArguments($handler, [$publisher, 'DEBUG', true]); | ||
} | ||
|
||
public function gelfEncoderProvider(): array | ||
{ | ||
return [ | ||
['json', 'Gelf\Encoder\JsonEncoder'], | ||
['compressed_json', 'Gelf\Encoder\CompressedJsonEncoder'], | ||
]; | ||
} | ||
|
||
public function testExceptionWhenUsingServiceWithoutId() | ||
{ | ||
$container = new ContainerBuilder(); | ||
|
Uh oh!
There was an error while loading. Please reload this page.