Skip to content

Commit

Permalink
[2.x] Closes monolog handlers by event listener if the worker stops (#…
Browse files Browse the repository at this point in the history
…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]>
  • Loading branch information
3 people authored Mar 22, 2024
1 parent 66cb38a commit 14a0eca
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 1 deletion.
3 changes: 2 additions & 1 deletion config/octane.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Laravel\Octane\Events\WorkerErrorOccurred;
use Laravel\Octane\Events\WorkerStarting;
use Laravel\Octane\Events\WorkerStopping;
use Laravel\Octane\Listeners\CloseMonologHandlers;
use Laravel\Octane\Listeners\CollectGarbage;
use Laravel\Octane\Listeners\DisconnectFromDatabases;
use Laravel\Octane\Listeners\EnsureUploadedFilesAreValid;
Expand Down Expand Up @@ -114,7 +115,7 @@
],

WorkerStopping::class => [
//
CloseMonologHandlers::class,
],
],

Expand Down
25 changes: 25 additions & 0 deletions src/Listeners/CloseMonologHandlers.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Laravel\Octane\Listeners;

class CloseMonologHandlers
{
/**
* Handle the event.
*
* @param mixed $event
*/
public function handle($event): void
{
if (! $event->app->resolved('log')) {
return;
}

collect($event->app->make('log')->getChannels())
->map
->getLogger()
->filter(fn ($logger) => method_exists($logger, 'close'))
->each
->close();
}
}
44 changes: 44 additions & 0 deletions tests/Listeners/CloseMonologHandlersTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

namespace Laravel\Octane\Listeners;

use Illuminate\Http\Request;
use Illuminate\Log\Logger;
use Laravel\Octane\Tests\TestCase;
use Mockery;
use Monolog;

class CloseMonologHandlersTest extends TestCase
{
/** @doesNotPerformAssertions */
public function test_logger_are_closed_after_worker_termination()
{
[$app, $worker, $client] = $this->createOctaneContext([
Request::create('/', 'GET'),
Request::create('/', 'GET'),
]);

$app['router']->middleware('web')->get('/', function () {
// ..
});

$worker->run();

$log = $app['log'];

$app['log'] = tap(Mockery::mock($log), function ($logger) {
$logger->shouldReceive('getChannels')->once()->andReturn([
tap(Mockery::mock(Logger::class), function ($logger) {
$logger->shouldReceive('getLogger')->once()->andReturn(
tap(Mockery::mock(Monolog\Logger::class), function ($logger) {
$logger->shouldReceive('close')->once();
}),
);
}),
]);
});

// The listener should call close on the monolog handlers after terminating the worker.
$worker->terminate();
}
}

0 comments on commit 14a0eca

Please sign in to comment.