88use Buggregator \Trap \Client \TrapHandle \Counter ;
99use Buggregator \Trap \Client \TrapHandle \Dumper as VarDumper ;
1010use Buggregator \Trap \Client \TrapHandle \StaticState ;
11+ use Buggregator \Trap \Log \TrapLogger ;
12+ use Psr \Log \LoggerInterface ;
1113use Symfony \Component \VarDumper \Caster \TraceStub ;
1214
1315/**
@@ -21,6 +23,9 @@ final class TrapHandle
2123 private int $ depth = 0 ;
2224 private readonly StaticState $ staticState ;
2325
26+ /** @var array<string, TrapLogger> */
27+ private static array $ loggers = [];
28+
2429 private function __construct (
2530 private array $ values ,
2631 ) {
@@ -35,6 +40,40 @@ public static function fromArray(array $array): self
3540 return new self ($ array );
3641 }
3742
43+ /**
44+ * Get a PSR-3 compatible logger instance for Trap client logging.
45+ *
46+ * Uses TRAP_MONOLOG_HOST and TRAP_MONOLOG_PORT env variables,
47+ * falling back to 127.0.0.1:9913.
48+ *
49+ * @param non-empty-string $channel Monolog channel name the records will be tagged with.
50+ */
51+ public static function logger (string $ channel = 'trap ' ): LoggerInterface
52+ {
53+ return self ::$ loggers [$ channel ] ??= self ::createLogger ($ channel );
54+ }
55+
56+ /**
57+ * @param non-empty-string $channel
58+ */
59+ private static function createLogger (string $ channel ): TrapLogger
60+ {
61+ $ host = self ::getEnvValue ('TRAP_MONOLOG_HOST ' , '127.0.0.1 ' );
62+ $ port = self ::getEnvValue ('TRAP_MONOLOG_PORT ' , '9913 ' );
63+
64+ $ port = \is_numeric ($ port ) ? (int ) $ port : 9913 ;
65+
66+ if ($ port < 1 || $ port > 65535 ) {
67+ $ port = 9913 ;
68+ }
69+
70+ return new TrapLogger (
71+ host: $ host ,
72+ port: $ port ,
73+ channel: $ channel ,
74+ );
75+ }
76+
3877 /**
3978 * Create a new instance with a single value.
4079 *
@@ -214,6 +253,25 @@ public function __destruct()
214253 $ this ->haveToSend () and $ this ->sendDump ();
215254 }
216255
256+ private static function getEnvValue (string $ name , string $ default ): string
257+ {
258+ if (\array_key_exists ($ name , $ _ENV )) {
259+ return $ _ENV [$ name ];
260+ }
261+
262+ $ value = \getenv ($ name , true );
263+ if ($ value !== false ) {
264+ return $ value ;
265+ }
266+
267+ $ value = \getenv ($ name );
268+ if ($ value !== false ) {
269+ return $ value ;
270+ }
271+
272+ return $ default ;
273+ }
274+
217275 private function sendDump (): void
218276 {
219277 $ staticState = StaticState::getValue ();
@@ -223,9 +281,9 @@ private function sendDump(): void
223281 try {
224282 // Set default values if not set
225283 if (!isset ($ _SERVER ['VAR_DUMPER_FORMAT ' ], $ _SERVER ['VAR_DUMPER_SERVER ' ])) {
226- $ _SERVER ['VAR_DUMPER_FORMAT ' ] = $ this -> getEnvValue ('VAR_DUMPER_FORMAT ' , 'server ' );
284+ $ _SERVER ['VAR_DUMPER_FORMAT ' ] = self :: getEnvValue ('VAR_DUMPER_FORMAT ' , 'server ' );
227285 // todo use the config file in the future
228- $ _SERVER ['VAR_DUMPER_SERVER ' ] = $ this -> getEnvValue ('VAR_DUMPER_SERVER ' , '127.0.0.1:9912 ' );
286+ $ _SERVER ['VAR_DUMPER_SERVER ' ] = self :: getEnvValue ('VAR_DUMPER_SERVER ' , '127.0.0.1:9912 ' );
229287 }
230288
231289 // Dump single value
@@ -248,25 +306,6 @@ private function sendDump(): void
248306 }
249307 }
250308
251- private function getEnvValue (string $ name , string $ default ): string
252- {
253- if (\array_key_exists ($ name , $ _ENV )) {
254- return $ _ENV [$ name ];
255- }
256-
257- $ value = \getenv ($ name , true );
258- if ($ value !== false ) {
259- return $ value ;
260- }
261-
262- $ value = \getenv ($ name );
263- if ($ value !== false ) {
264- return $ value ;
265- }
266-
267- return $ default ;
268- }
269-
270309 private function haveToSend (): bool
271310 {
272311 if (!$ this ->haveToSend || $ this ->values === []) {
0 commit comments