Skip to content

Commit 14a0eca

Browse files
[2.x] Closes monolog handlers by event listener if the worker stops (#854)
* Implement close monolog handler listener including test * Fix code styling * Rename test case * Fix test class name * Negative unit test * Revert test * Revert test on-behalf-of: @e-solutions-GmbH <[email protected]> * Update octane.php * formatting --------- Co-authored-by: NiroDeveloper <[email protected]> Co-authored-by: Taylor Otwell <[email protected]>
1 parent 66cb38a commit 14a0eca

File tree

3 files changed

+71
-1
lines changed

3 files changed

+71
-1
lines changed

config/octane.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Laravel\Octane\Events\WorkerErrorOccurred;
1212
use Laravel\Octane\Events\WorkerStarting;
1313
use Laravel\Octane\Events\WorkerStopping;
14+
use Laravel\Octane\Listeners\CloseMonologHandlers;
1415
use Laravel\Octane\Listeners\CollectGarbage;
1516
use Laravel\Octane\Listeners\DisconnectFromDatabases;
1617
use Laravel\Octane\Listeners\EnsureUploadedFilesAreValid;
@@ -114,7 +115,7 @@
114115
],
115116

116117
WorkerStopping::class => [
117-
//
118+
CloseMonologHandlers::class,
118119
],
119120
],
120121

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace Laravel\Octane\Listeners;
4+
5+
class CloseMonologHandlers
6+
{
7+
/**
8+
* Handle the event.
9+
*
10+
* @param mixed $event
11+
*/
12+
public function handle($event): void
13+
{
14+
if (! $event->app->resolved('log')) {
15+
return;
16+
}
17+
18+
collect($event->app->make('log')->getChannels())
19+
->map
20+
->getLogger()
21+
->filter(fn ($logger) => method_exists($logger, 'close'))
22+
->each
23+
->close();
24+
}
25+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace Laravel\Octane\Listeners;
4+
5+
use Illuminate\Http\Request;
6+
use Illuminate\Log\Logger;
7+
use Laravel\Octane\Tests\TestCase;
8+
use Mockery;
9+
use Monolog;
10+
11+
class CloseMonologHandlersTest extends TestCase
12+
{
13+
/** @doesNotPerformAssertions */
14+
public function test_logger_are_closed_after_worker_termination()
15+
{
16+
[$app, $worker, $client] = $this->createOctaneContext([
17+
Request::create('/', 'GET'),
18+
Request::create('/', 'GET'),
19+
]);
20+
21+
$app['router']->middleware('web')->get('/', function () {
22+
// ..
23+
});
24+
25+
$worker->run();
26+
27+
$log = $app['log'];
28+
29+
$app['log'] = tap(Mockery::mock($log), function ($logger) {
30+
$logger->shouldReceive('getChannels')->once()->andReturn([
31+
tap(Mockery::mock(Logger::class), function ($logger) {
32+
$logger->shouldReceive('getLogger')->once()->andReturn(
33+
tap(Mockery::mock(Monolog\Logger::class), function ($logger) {
34+
$logger->shouldReceive('close')->once();
35+
}),
36+
);
37+
}),
38+
]);
39+
});
40+
41+
// The listener should call close on the monolog handlers after terminating the worker.
42+
$worker->terminate();
43+
}
44+
}

0 commit comments

Comments
 (0)