Skip to content

Commit 7c158b5

Browse files
authored
Merge pull request #17 from sixlive/custom-log-handler
Custom log handler and driver
2 parents a5d9d3a + 9ae20fa commit 7c158b5

File tree

7 files changed

+93
-19
lines changed

7 files changed

+93
-19
lines changed

.styleci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ preset: laravel
33
disabled:
44
- laravel_braces
55
- single_class_element_per_statement
6+
- alpha_ordered_imports

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
55
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
8+
### Added
9+
- Added custom log driver ([#17](https://github.com/honeybadger-io/honeybadger-laravel/pull/17))
810

911
## [3.11.0] - 2021-06-16
10-
### Added
1112
- Set default client timeout ([#87](https://github.com/honeybadger-io/honeybadger-laravel/pull/87))
1213

1314
## [3.10.0] - 2021-05-09

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"sixlive/dotenv-editor": "^1.1",
2727
"illuminate/console": "^7.0|^8.0",
2828
"illuminate/support": "^7.0|^8.0",
29+
"monolog/monolog": "^2.0",
2930
"ext-json": "*"
3031
},
3132
"require-dev": {

src/HoneybadgerLogDriver.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Honeybadger\HoneybadgerLaravel;
4+
5+
use Honeybadger\LogHandler;
6+
use Illuminate\Support\Facades\App;
7+
use Monolog\Logger;
8+
9+
class HoneybadgerLogDriver
10+
{
11+
public function __invoke(array $config): Logger
12+
{
13+
return tap(new Logger($config['name'] ?? 'honeybadger'), function ($logger) {
14+
$logger->pushHandler(App::make(LogHandler::class));
15+
});
16+
}
17+
}

src/HoneybadgerServiceProvider.php

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
namespace Honeybadger\HoneybadgerLaravel;
44

55
use GuzzleHttp\Client;
6+
use Honeybadger\LogHandler;
7+
use Honeybadger\Honeybadger;
68
use Honeybadger\Contracts\Reporter;
79
use Honeybadger\Exceptions\ServiceException;
8-
use Honeybadger\Honeybadger;
910
use Honeybadger\HoneybadgerLaravel\Commands\HoneybadgerCheckinCommand;
1011
use Honeybadger\HoneybadgerLaravel\Commands\HoneybadgerDeployCommand;
1112
use Honeybadger\HoneybadgerLaravel\Commands\HoneybadgerInstallCommand;
@@ -44,23 +45,10 @@ public function register()
4445
{
4546
$this->mergeConfigFrom(__DIR__.'/../config/honeybadger.php', 'honeybadger');
4647

47-
$this->app->singleton(Reporter::class, function ($app) {
48-
return HoneybadgerLaravel::make($app['config']['honeybadger']);
49-
});
50-
51-
$this->app->alias(Reporter::class, Honeybadger::class);
52-
$this->app->alias(Reporter::class, 'honeybadger');
53-
54-
// In some cases (like the test command), we definitely want to throw any errors
55-
// Laravel's contextual binding doesn't support method injection,
56-
// so the handle() method will have to request this client specifically.
57-
$this->app->singleton('honeybadger.loud', function ($app) {
58-
$config = $app['config']['honeybadger'];
59-
$config['service_exception_handler'] = function (ServiceException $e) {
60-
throw $e;
61-
};
48+
$this->registerReporters();
6249

63-
return HoneybadgerLaravel::make($config);
50+
$this->app->bind(LogHandler::class, function ($app) {
51+
return new LogHandler($app[Reporter::class]);
6452
});
6553

6654
$this->app->singleton('honeybadger.isLumen', function () {
@@ -185,4 +173,26 @@ protected function setUpAutomaticBreadcrumbs()
185173
(new $breadcrumb)->register();
186174
}
187175
}
176+
177+
protected function registerReporters(): void
178+
{
179+
$this->app->singleton(Reporter::class, function ($app) {
180+
return HoneybadgerLaravel::make($app['config']['honeybadger']);
181+
});
182+
183+
$this->app->alias(Reporter::class, Honeybadger::class);
184+
$this->app->alias(Reporter::class, 'honeybadger');
185+
186+
// In some cases (like the test command), we definitely want to throw any errors
187+
// Laravel's contextual binding doesn't support method injection,
188+
// so the handle() method will have to request this client specifically.
189+
$this->app->singleton('honeybadger.loud', function ($app) {
190+
$config = $app['config']['honeybadger'];
191+
$config['service_exception_handler'] = function (ServiceException $e) {
192+
throw $e;
193+
};
194+
195+
return HoneybadgerLaravel::make($config);
196+
});
197+
}
188198
}

tests/HoneybadgerServiceProviderTest.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
namespace Honeybadger\Tests;
44

5-
use Honeybadger\Contracts\Reporter;
5+
use Honeybadger\LogHandler;
66
use Honeybadger\Honeybadger;
7+
use Honeybadger\Contracts\Reporter;
78
use Honeybadger\HoneybadgerLaravel\Facades\Honeybadger as HoneybadgerFacade;
89

910
class HoneybadgerServiceProviderTest extends TestCase
@@ -21,4 +22,10 @@ public function aliases_are_set()
2122
$this->assertInstanceOf(Honeybadger::class, $this->app[Honeybadger::class]);
2223
$this->assertInstanceOf(Honeybadger::class, $this->app['honeybadger']);
2324
}
25+
26+
/** @test */
27+
public function it_registers_the_log_handler()
28+
{
29+
$this->assertInstanceOf(LogHandler::class, $this->app[LogHandler::class]);
30+
}
2431
}

tests/LogDriverTest.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace Honeybadger\Tests;
4+
5+
use Illuminate\Support\Facades\Log;
6+
use Honeybadger\HoneybadgerLaravel\HoneybadgerLogDriver;
7+
use Honeybadger\LogHandler;
8+
9+
class LogDriverTest extends TestCase
10+
{
11+
/** @test */
12+
public function the_log_driver_can_be_correctly_registered_and_used()
13+
{
14+
$this->app['config']->set('logging.channels.honeybadger', [
15+
'driver' => 'custom',
16+
'via' => HoneybadgerLogDriver::class,
17+
'name' => 'asdf', // optional point of customization
18+
]);
19+
20+
$logHandler = $this->getMockBuilder(LogHandler::class)
21+
->disableOriginalConstructor()
22+
->setMethods(['write'])
23+
->getMock();
24+
25+
$logHandler->expects($this->once())
26+
->method('write')
27+
->with($this->callback(function ($record) {
28+
return $record['message'] === 'Test message'
29+
&& $record['level_name'] === 'INFO'
30+
&& $record['channel'] === 'asdf';
31+
}));
32+
33+
$this->app[LogHandler::class] = $logHandler;
34+
35+
Log::channel('honeybadger')->info('Test message');
36+
}
37+
}

0 commit comments

Comments
 (0)