From fafad2e32883eb9dc03b646d0f82b2987e8af880 Mon Sep 17 00:00:00 2001 From: Nuno Maduro Date: Tue, 21 Feb 2023 15:49:06 +0000 Subject: [PATCH] [4.x] Allows to specify the log level (#1312) * Allows to specify log level * Apply fixes from StyleCI * Update src/Watchers/LogWatcher.php Co-authored-by: Dries Vints * Update LogWatcher.php * formatting --------- Co-authored-by: StyleCI Bot Co-authored-by: Taylor Otwell Co-authored-by: Dries Vints --- config/telescope.php | 7 ++- src/Watchers/LogWatcher.php | 28 ++++++++- tests/Watchers/LogWatcherTest.php | 101 +++++++++++++++++++++++++++++- 3 files changed, 131 insertions(+), 5 deletions(-) diff --git a/config/telescope.php b/config/telescope.php index f9a10e0b7..193b4672e 100644 --- a/config/telescope.php +++ b/config/telescope.php @@ -149,7 +149,12 @@ ], Watchers\JobWatcher::class => env('TELESCOPE_JOB_WATCHER', true), - Watchers\LogWatcher::class => env('TELESCOPE_LOG_WATCHER', true), + + Watchers\LogWatcher::class => [ + 'enabled' => env('TELESCOPE_LOG_WATCHER', true), + 'level' => 'error', + ], + Watchers\MailWatcher::class => env('TELESCOPE_MAIL_WATCHER', true), Watchers\ModelWatcher::class => [ diff --git a/src/Watchers/LogWatcher.php b/src/Watchers/LogWatcher.php index 9cdab21ac..a0f5edf01 100644 --- a/src/Watchers/LogWatcher.php +++ b/src/Watchers/LogWatcher.php @@ -6,10 +6,25 @@ use Illuminate\Support\Arr; use Laravel\Telescope\IncomingEntry; use Laravel\Telescope\Telescope; +use Psr\Log\LogLevel; use Throwable; class LogWatcher extends Watcher { + /** + * The available log level priorities. + */ + private const PRIORITIES = [ + LogLevel::DEBUG => 100, + LogLevel::INFO => 200, + LogLevel::NOTICE => 250, + LogLevel::WARNING => 300, + LogLevel::ERROR => 400, + LogLevel::CRITICAL => 500, + LogLevel::ALERT => 550, + LogLevel::EMERGENCY => 600, + ]; + /** * Register the watcher. * @@ -61,7 +76,16 @@ private function tags($event) */ private function shouldIgnore($event) { - return isset($event->context['exception']) && - $event->context['exception'] instanceof Throwable; + if (isset($event->context['exception']) && $event->context['exception'] instanceof Throwable) { + return true; + } + + $minimumTelescopeLogLevel = static::PRIORITIES[$this->options['level'] ?? 'debug'] + ?? static::PRIORITIES[LogLevel::DEBUG]; + + $eventLogLevel = static::PRIORITIES[$event->level] + ?? static::PRIORITIES[LogLevel::DEBUG]; + + return $eventLogLevel < $minimumTelescopeLogLevel; } } diff --git a/tests/Watchers/LogWatcherTest.php b/tests/Watchers/LogWatcherTest.php index 74fa75934..140c51657 100644 --- a/tests/Watchers/LogWatcherTest.php +++ b/tests/Watchers/LogWatcherTest.php @@ -16,8 +16,25 @@ protected function getEnvironmentSetUp($app) $app->get('config')->set('logging.default', 'syslog'); + $config = match ($this->getName(false)) { + 'test_log_watcher_registers_entry_for_any_level_by_default' => true, + 'test_log_watcher_only_registers_entries_for_the_specified_error_level_priority' => [ + 'enabled' => true, + 'level' => 'error', + ], + 'test_log_watcher_only_registers_entries_for_the_specified_debug_level_priority' => [ + 'level' => 'debug', + ], + 'test_log_watcher_do_not_registers_entry_when_disabled_on_the_boolean_format' => false, + 'test_log_watcher_do_not_registers_entry_when_disabled_on_the_array_format' => [ + 'enabled' => false, + 'level' => 'error', + ], + 'test_log_watcher_registers_entry_with_exception_key' => true, + }; + $app->get('config')->set('telescope.watchers', [ - LogWatcher::class => true, + LogWatcher::class => $config, ]); } @@ -38,7 +55,53 @@ public function logLevelProvider() /** * @dataProvider logLevelProvider */ - public function test_log_watcher_registers_entry_for_any_level($level) + public function test_log_watcher_registers_entry_for_any_level_by_default($level) + { + $logger = $this->app->get(LoggerInterface::class); + + $logger->$level("Logging Level [$level].", [ + 'user' => 'Claire Redfield', + 'role' => 'Zombie Hunter', + ]); + + $entry = $this->loadTelescopeEntries()->first(); + + $this->assertSame(EntryType::LOG, $entry->type); + $this->assertSame($level, $entry->content['level']); + $this->assertSame("Logging Level [$level].", $entry->content['message']); + $this->assertSame('Claire Redfield', $entry->content['context']['user']); + $this->assertSame('Zombie Hunter', $entry->content['context']['role']); + } + + /** + * @dataProvider logLevelProvider + */ + public function test_log_watcher_only_registers_entries_for_the_specified_error_level_priority($level) + { + $logger = $this->app->get(LoggerInterface::class); + + $logger->$level("Logging Level [$level].", [ + 'user' => 'Claire Redfield', + 'role' => 'Zombie Hunter', + ]); + + $entry = $this->loadTelescopeEntries()->first(); + + if (in_array($level, [LogLevel::EMERGENCY, LogLevel::ALERT, LogLevel::CRITICAL, LogLevel::ERROR])) { + $this->assertSame(EntryType::LOG, $entry->type); + $this->assertSame($level, $entry->content['level']); + $this->assertSame("Logging Level [$level].", $entry->content['message']); + $this->assertSame('Claire Redfield', $entry->content['context']['user']); + $this->assertSame('Zombie Hunter', $entry->content['context']['role']); + } else { + $this->assertNull($entry); + } + } + + /** + * @dataProvider logLevelProvider + */ + public function test_log_watcher_only_registers_entries_for_the_specified_debug_level_priority($level) { $logger = $this->app->get(LoggerInterface::class); @@ -56,6 +119,40 @@ public function test_log_watcher_registers_entry_for_any_level($level) $this->assertSame('Zombie Hunter', $entry->content['context']['role']); } + /** + * @dataProvider logLevelProvider + */ + public function test_log_watcher_do_not_registers_entry_when_disabled_on_the_boolean_format($level) + { + $logger = $this->app->get(LoggerInterface::class); + + $logger->$level("Logging Level [$level].", [ + 'user' => 'Claire Redfield', + 'role' => 'Zombie Hunter', + ]); + + $entry = $this->loadTelescopeEntries()->first(); + + $this->assertNull($entry); + } + + /** + * @dataProvider logLevelProvider + */ + public function test_log_watcher_do_not_registers_entry_when_disabled_on_the_array_format($level) + { + $logger = $this->app->get(LoggerInterface::class); + + $logger->$level("Logging Level [$level].", [ + 'user' => 'Claire Redfield', + 'role' => 'Zombie Hunter', + ]); + + $entry = $this->loadTelescopeEntries()->first(); + + $this->assertNull($entry); + } + public function test_log_watcher_registers_entry_with_exception_key() { $logger = $this->app->get(LoggerInterface::class);