Skip to content

Commit a5e1f84

Browse files
petrdobrroxblnfk
andauthored
feat: add PSR-3 Trap logger with STDERR fallback (#212)
Co-authored-by: roxblnfk <roxblnfk@ya.ru>
1 parent f146f04 commit a5e1f84

5 files changed

Lines changed: 576 additions & 72 deletions

File tree

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
"php-http/message": "^1.15",
4747
"psr/container": "^1.1 || ^2.0",
4848
"psr/http-message": "^1.1 || ^2",
49+
"psr/log": "^2 || ^3",
4950
"symfony/console": "^6.4 || ^7 || ^8",
5051
"symfony/var-dumper": "^6.3 || ^7 || ^8",
5152
"yiisoft/injector": "^1.2"

composer.lock

Lines changed: 51 additions & 51 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Client/TrapHandle.php

Lines changed: 60 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
use Buggregator\Trap\Client\TrapHandle\Counter;
99
use Buggregator\Trap\Client\TrapHandle\Dumper as VarDumper;
1010
use Buggregator\Trap\Client\TrapHandle\StaticState;
11+
use Buggregator\Trap\Log\TrapLogger;
12+
use Psr\Log\LoggerInterface;
1113
use 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

Comments
 (0)