Skip to content

Instantly share code, notes, and snippets.

@AndreiTelteu
Created September 20, 2023 15:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndreiTelteu/27c7be672fc1740636bec4907dcaffb4 to your computer and use it in GitHub Desktop.
Save AndreiTelteu/27c7be672fc1740636bec4907dcaffb4 to your computer and use it in GitHub Desktop.
Axiom Logger for Laravel v10

app/Logging/AxiomLogger.php

<?php

namespace App\Logging;

use Http;
use Monolog\Logger;
use Monolog\Handler\HandlerInterface;
use Monolog\LogRecord;


class AxiomLogger {
    
    public function __invoke(array $config): Logger
    {
        $logger = new Logger('axiom');
        $logger->pushHandler(new AxiomLoggerHandler);
        return $logger;
    }
    
}

class AxiomLoggerHandler implements HandlerInterface {
    public function close(): void {}
    public function isHandling(LogRecord $record): bool {
        return true;
    }
    
    public function handleBatch(array $records): void {
        $token = env('AXIOM_TOKEN');
        $DATASET_NAME = env('AXIOM_DATASET');
        Http::withToken($token)
            ->withBody($this->makeBody($records), 'application/json')
            ->post("https://api.axiom.co/v1/datasets/$DATASET_NAME/ingest");
    }
    
    public function handle(LogRecord $record): bool {
        $token = env('AXIOM_TOKEN');
        $DATASET_NAME = env('AXIOM_DATASET');
        Http::withToken($token)
            ->withBody($this->makeBody([$record]), 'application/json')
            ->post("https://api.axiom.co/v1/datasets/$DATASET_NAME/ingest");
        return true;
    }
    
    /** @param LogRecord[] $records */
    public function makeBody(array $records = []) {
        $messages = [];
        foreach ($records as $record) {
            $messages[] = array_merge([
                '_time' => $record->datetime->format('c'),
                'ENV' => app()->environment(),
            ], $record->toArray());
        }
        return json_encode($messages);
    }
}

config/logging.php in channels add axiom

'axiom' => [
    'driver' => 'custom',
    'via' => App\Logging\AxiomLogger::class,
    'level' => 'error',
],

.env

LOG_CHANNEL=axiom
AXIOM_TOKEN="your ingest token"
AXIOM_DATASET="your dataset name"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment