commit 9ee4440e3302fe7bf58c4e8a7cebb04913b83070 Author: Christopher Vagnetoft Date: Thu Jun 26 21:46:54 2025 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57872d0 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/vendor/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..8720063 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# Monolog handler for LogDB + +This is a handler to allow Monolog to be used with LogDB. + +## Using + +### Symfony 5+ + +```yaml +# config/services.yaml +services: + LogDb\Monolog\LogDbHandler: + arguments: + $serverUrl: "http://127.0.0.1:8000" + $scope: "org.myplatform.myapp.web" + $source: "My App" +``` + +```yaml +# config/packages/prod/monolog.yaml +monolog: + handlers: + logdb: + type: service + id: LogDb\Monolog\LogDbHandler +``` + +```yaml +# config/packages/prod/monolog.yaml +monolog: + handlers: + main: + type: fingers_crossed + handler: logdb + logdb: + type: service + id: LogDb\Monolog\LogDbHandler +``` diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..7c6a8a4 --- /dev/null +++ b/composer.json @@ -0,0 +1,21 @@ +{ + "name": "logdb/monolog-handler", + "description": "Monolog handler for LogDB", + "type": "library", + "license": "GPL-2.0-or-later", + "autoload": { + "psr-4": { + "LogDb\\Monolog\\": "src/" + } + }, + "authors": [ + { + "name": "Christopher Vagnetoft", + "email": "labs@noccy.com" + } + ], + "require": { + "monolog/monolog": "^3.9", + "symfony/http-client": "^7.3" + } +} diff --git a/src/LogDbHandler.php b/src/LogDbHandler.php new file mode 100644 index 0000000..b2bd4f8 --- /dev/null +++ b/src/LogDbHandler.php @@ -0,0 +1,75 @@ +client = HttpClient::createForBaseUri($this->serverUrl); + } + + public function handleBatch(array $records): void + { + $this->batching = true; + parent::handleBatch($records); + $this->batching = false; + $this->commit(); + } + + protected function write(LogRecord $record): void + { + $event = [ + 'source' => $this->source, + 'scope' => $this->scope, + 'date' => $record->datetime->format('Y-m-d H:i:s P'), + 'level' => $record->level->toPsrLogLevel(), + 'brief' => $record->message, + 'detail' => $record->formatted, + 'context' => $record->context, + ]; + + if ($this->batching) { + $this->batched[] = $record; + return; + } + + try { + $response = $this->client->request('POST', '/api/logdb/v1/create-event', [ + 'json' => $event + ]); + $response->getContent(true); + } catch (\Exception $e) { + // Silent fault. + } + } + + private function commit(): void + { + try { + $response = $this->client->request('POST', '/api/logdb/v1/create-event', [ + 'json' => $this->batched + ]); + $response->getContent(true); + } finally { + $this->batched = []; + } + + } +} \ No newline at end of file