From 0b8e72fb7b705a362cf0437b64819659ba5bca1d Mon Sep 17 00:00:00 2001 From: mherrlein Date: Thu, 23 Oct 2025 12:21:31 +0200 Subject: [PATCH] Exclude Log Levels --- config/loghandler.php | 4 ++++ src/LogForwarder.php | 51 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/config/loghandler.php b/config/loghandler.php index 967a929..07c2380 100644 --- a/config/loghandler.php +++ b/config/loghandler.php @@ -8,4 +8,8 @@ return [ 'timeout_ms' => env('LOGHANDLER_TIMEOUT_MS', 3000), 'retry_times' => env('LOGHANDLER_RETRY_TIMES', 0), 'include_trace' => env('LOGHANDLER_INCLUDE_TRACE', false), + 'excluded_levels' => array_values(array_filter(array_map( + static fn (string $level): string => strtolower($level), + array_map('trim', explode(',', (string) env('LOGHANDLER_EXCLUDE_LEVELS', 'debug,info'))) + ))), ]; diff --git a/src/LogForwarder.php b/src/LogForwarder.php index 3a7d232..1bf8e95 100644 --- a/src/LogForwarder.php +++ b/src/LogForwarder.php @@ -6,8 +6,10 @@ use ErrorException; use GuzzleHttp\ClientInterface; use GuzzleHttp\Exception\GuzzleException; use Illuminate\Contracts\Config\Repository; +use Monolog\Level; use Monolog\LogRecord; use Throwable; +use ValueError; class LogForwarder { @@ -24,6 +26,12 @@ class LogForwarder return; } + $excludedLevels = $this->resolveExcludedLevels($settings); + + if ($this->shouldExcludeLevel($record->level, $excludedLevels)) { + return; + } + $endpoint = (string) ($settings['endpoint'] ?? ''); $token = (string) ($settings['token'] ?? ''); @@ -141,4 +149,47 @@ class LogForwarder return (string) ($record->context['trace'] ?? ''); } + + /** + * @param array $settings + * @return Level[] + */ + private function resolveExcludedLevels(array $settings): array + { + $levels = $settings['excluded_levels'] ?? []; + + if (! is_array($levels)) { + $levels = [$levels]; + } + + $resolved = []; + + foreach ($levels as $level) { + if (! is_string($level) || $level === '') { + continue; + } + + try { + $resolved[] = Level::fromName($level); + } catch (ValueError) { + continue; + } + } + + return $resolved; + } + + /** + * @param Level[] $excludedLevels + */ + private function shouldExcludeLevel(Level $recordLevel, array $excludedLevels): bool + { + foreach ($excludedLevels as $level) { + if ($recordLevel === $level) { + return true; + } + } + + return false; + } }