Skip to content

Commit 3269695

Browse files
Merge pull request #3 from koderhut/add-monolog-request-id
Add monolog request identifier processor
2 parents 75ebca8 + 21e7026 commit 3269695

16 files changed

+536
-18
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace KoderHut\OnelogBundle\DependencyInjection\Compiler;
4+
5+
use KoderHut\OnelogBundle\Monolog\RequestIdProcessor;
6+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
7+
use Symfony\Component\DependencyInjection\ContainerBuilder;
8+
9+
/**
10+
* Class RequestIdentifierInjectorPass
11+
*
12+
* @author Denis-Florin Rendler <connect@rendler.me>
13+
*/
14+
class RequestIdentifierPass implements CompilerPassInterface
15+
{
16+
17+
/**
18+
* @inheritdoc
19+
*/
20+
public function process(ContainerBuilder $container)
21+
{
22+
if (!$container->hasParameter('onelog.enable_request_id') || true === $container->getParameter('onelog.enable_request_id')) {
23+
return;
24+
}
25+
26+
$container->removeDefinition(RequestIdProcessor::class);
27+
}
28+
}

DependencyInjection/Configuration.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ public function getConfigTreeBuilder()
4040
->defaultFalse()
4141
->treatNullLike(false)
4242
->end()
43+
->booleanNode('enable_request_id')
44+
->info('Add a request identifier to all log entries. Allows for easier tracking of logs during a request')
45+
->defaultTrue()
46+
->treatNullLike(true)
47+
->end()
4348
->end();
4449

4550
return $treeBuilder;

DependencyInjection/OnelogExtension.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,6 @@ public function load(array $configs, ContainerBuilder $container)
2828
$container->setParameter('onelog.logger_service', $config['logger_service']);
2929
$container->setParameter('onelog.register_global', $config['register_global']);
3030
$container->setParameter('onelog.register_monolog_channels', $config['register_monolog_channels']);
31+
$container->setParameter('onelog.enable_request_id', $config['enable_request_id']);
3132
}
3233
}

Helper/OneLogStatic.php

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,6 @@ public static function destroy()
6565
*/
6666
public static function __callStatic(string $level, $params)
6767
{
68-
if (!static::$resolved instanceof OneLog) {
69-
throw new \RuntimeException('Logger is not properly instantiated!');
70-
}
71-
72-
return self::$resolved->{$level}(...$params);
68+
return self::instance()->{$level}(...$params);
7369
}
7470
}

Monolog/RequestIdProcessor.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace KoderHut\OnelogBundle\Monolog;
4+
5+
use KoderHut\OnelogBundle\Request\IdentifierInterface;
6+
use KoderHut\OnelogBundle\Request\Identifier as RequestId;
7+
8+
/**
9+
* Class RequestIdProcessor
10+
*
11+
* @author Denis-Florin Rendler <connect@rendler.me>
12+
*/
13+
class RequestIdProcessor
14+
{
15+
16+
/**
17+
* @var int
18+
*/
19+
private $logCount = 1;
20+
21+
/**
22+
* @var RequestId
23+
*/
24+
private $requestId;
25+
26+
/**
27+
* RequestIdProcessor constructor.
28+
*
29+
* @param IdentifierInterface $requestId
30+
*/
31+
public function __construct(IdentifierInterface $requestId = null)
32+
{
33+
$this->requestId = $requestId ?? RequestId::generate();
34+
}
35+
36+
/**
37+
* Add the request id to the log entry
38+
*
39+
* @param array $record
40+
*
41+
* @return array
42+
*/
43+
public function __invoke(array $record): array
44+
{
45+
$record['extra']['request_id'] = $this->requestId->identifier() . '.' . $this->logCount;
46+
$this->logCount++;
47+
48+
return $record;
49+
}
50+
}

OnelogBundle.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use KoderHut\OnelogBundle\DependencyInjection\Compiler\LoggerWrapPass;
66
use KoderHut\OnelogBundle\DependencyInjection\Compiler\RegisterMonologChannels;
7+
use KoderHut\OnelogBundle\DependencyInjection\Compiler\RequestIdentifierPass;
78
use KoderHut\OnelogBundle\Helper\GlobalNamespaceRegister;
89
use Symfony\Component\DependencyInjection\ContainerBuilder;
910
use Symfony\Component\HttpKernel\Bundle\Bundle;
@@ -29,6 +30,7 @@ public function build(ContainerBuilder $container)
2930
{
3031
$container->addCompilerPass(new LoggerWrapPass());
3132
$container->addCompilerPass(new RegisterMonologChannels());
33+
$container->addCompilerPass(new RequestIdentifierPass());
3234
}
3335

3436
}

PSRLoggerTrait.php

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@
99
*/
1010
trait PSRLoggerTrait
1111
{
12+
1213
/**
1314
* @param mixed $message
1415
* @param array $context
1516
*/
16-
public function emergency($message, array $context = array())
17+
public function emergency($message, array $context = [])
1718
{
1819
$this->defaultLogger->emergency($message, $context);
1920
}
@@ -22,7 +23,7 @@ public function emergency($message, array $context = array())
2223
* @param mixed $message
2324
* @param array $context
2425
*/
25-
public function alert($message, array $context = array())
26+
public function alert($message, array $context = [])
2627
{
2728
$this->defaultLogger->alert($message, $context);
2829
}
@@ -31,7 +32,7 @@ public function alert($message, array $context = array())
3132
* @param mixed $message
3233
* @param array $context
3334
*/
34-
public function critical($message, array $context = array())
35+
public function critical($message, array $context = [])
3536
{
3637
$this->defaultLogger->critical($message, $context);
3738
}
@@ -40,7 +41,7 @@ public function critical($message, array $context = array())
4041
* @param mixed $message
4142
* @param array $context
4243
*/
43-
public function error($message, array $context = array())
44+
public function error($message, array $context = [])
4445
{
4546
$this->defaultLogger->error($message, $context);
4647
}
@@ -49,7 +50,7 @@ public function error($message, array $context = array())
4950
* @param mixed $message
5051
* @param array $context
5152
*/
52-
public function warning($message, array $context = array())
53+
public function warning($message, array $context = [])
5354
{
5455
$this->defaultLogger->warning($message, $context);
5556
}
@@ -58,7 +59,7 @@ public function warning($message, array $context = array())
5859
* @param mixed $message
5960
* @param array $context
6061
*/
61-
public function notice($message, array $context = array())
62+
public function notice($message, array $context = [])
6263
{
6364
$this->defaultLogger->notice($message, $context);
6465
}
@@ -67,7 +68,7 @@ public function notice($message, array $context = array())
6768
* @param mixed $message
6869
* @param array $context
6970
*/
70-
public function info($message, array $context = array())
71+
public function info($message, array $context = [])
7172
{
7273
$this->defaultLogger->info($message, $context);
7374
}
@@ -76,7 +77,7 @@ public function info($message, array $context = array())
7677
* @param mixed $message
7778
* @param array $context
7879
*/
79-
public function debug($message, array $context = array())
80+
public function debug($message, array $context = [])
8081
{
8182
$this->defaultLogger->debug($message, $context);
8283
}
@@ -86,8 +87,8 @@ public function debug($message, array $context = array())
8687
* @param mixed $message
8788
* @param array $context
8889
*/
89-
public function log($level, $message, array $context = array())
90+
public function log($level, $message, array $context = [])
9091
{
91-
return $this->defaultLogger->log($level, $message, $context);
92+
$this->defaultLogger->log($level, $message, $context);
9293
}
9394
}

Request/Identifier.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace KoderHut\OnelogBundle\Request;
4+
5+
/**
6+
* Class Identifier
7+
*
8+
* @author Denis-Florin Rendler <connect@rendler.me>
9+
*/
10+
class Identifier implements IdentifierInterface
11+
{
12+
13+
/**
14+
* @var string
15+
*/
16+
private $identifier;
17+
18+
/**
19+
* Identifier constructor.
20+
*
21+
* @param string $identifier
22+
*/
23+
public function __construct(string $identifier)
24+
{
25+
$this->identifier = $identifier;
26+
}
27+
28+
/**
29+
* It will generate an instance based on the current date
30+
* using the format YmdHis.u
31+
*
32+
* @param string ...$salts
33+
*
34+
* @return Identifier
35+
*/
36+
public static function generate(string ...$salts)
37+
{
38+
$hashData = (string) (new \DateTime())->format('Ymd.His.u');
39+
40+
if (!empty($salts)) {
41+
$hashData .= '.' . implode('.', $salts);
42+
}
43+
44+
return new self($hashData);
45+
}
46+
47+
/**
48+
* @inheritdoc
49+
*/
50+
public function identifier(): string
51+
{
52+
return $this->identifier;
53+
}
54+
55+
}

Request/IdentifierInterface.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace KoderHut\OnelogBundle\Request;
4+
5+
/**
6+
* Interface IdentifierInterface
7+
*
8+
* @author Denis-Florin Rendler <connect@rendler.me>
9+
*/
10+
interface IdentifierInterface
11+
{
12+
13+
/**
14+
* Return the current identifier
15+
*
16+
* @return string
17+
*/
18+
public function identifier(): string;
19+
}

Resources/config/onelog.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
<service class="KoderHut\OnelogBundle\Helper\NullLogger" public="false" />
1212
</argument>
1313
</service>
14+
15+
<service id="KoderHut\OnelogBundle\Monolog\RequestIdProcessor" class="KoderHut\OnelogBundle\Monolog\RequestIdProcessor" public="false">
16+
<tag name="monolog.processor" />
17+
</service>
1418
</services>
1519

1620
</container>
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace KoderHut\OneLogBundle\Tests\DependencyInjection\Compiler;
4+
5+
use KoderHut\OnelogBundle\DependencyInjection\Compiler\RequestIdentifierPass;
6+
use KoderHut\OnelogBundle\Monolog\RequestIdProcessor;
7+
use PHPUnit\Framework\TestCase;
8+
use Symfony\Component\DependencyInjection\ContainerBuilder;
9+
10+
class RequestIdentifierPassTest extends TestCase
11+
{
12+
13+
/**
14+
* @test
15+
*/
16+
public function testExitEarlyIfRequestIdentifierIsEnabled()
17+
{
18+
$container = $this->prophesize(ContainerBuilder::class);
19+
$container->hasParameter('onelog.enable_request_id')
20+
->shouldBeCalled()
21+
->willReturn(false)
22+
;
23+
24+
$instance = new RequestIdentifierPass();
25+
26+
$instance->process($container->reveal());
27+
}
28+
29+
/**
30+
* @test
31+
*/
32+
public function testExitEarlyIfConfigParamIsMissing()
33+
{
34+
$container = $this->prophesize(ContainerBuilder::class);
35+
$container->hasParameter('onelog.enable_request_id')
36+
->shouldBeCalled()
37+
->willReturn(true)
38+
;
39+
$container->getParameter('onelog.enable_request_id')
40+
->shouldBeCalled()
41+
->willReturn(true)
42+
;
43+
44+
$instance = new RequestIdentifierPass();
45+
46+
$instance->process($container->reveal());
47+
}
48+
49+
/**
50+
* @test
51+
*/
52+
public function testRemoveRequestIdServiceIfConfigIsSetToFalse()
53+
{
54+
$container = $this->prophesize(ContainerBuilder::class);
55+
$container->hasParameter('onelog.enable_request_id')
56+
->shouldBeCalled()
57+
->willReturn(true)
58+
;
59+
$container->getParameter('onelog.enable_request_id')
60+
->shouldBeCalled()
61+
->willReturn(false)
62+
;
63+
$container->removeDefinition(RequestIdProcessor::class)->shouldBeCalled();
64+
65+
$instance = new RequestIdentifierPass();
66+
67+
$instance->process($container->reveal());
68+
}
69+
}

0 commit comments

Comments
 (0)