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"