Mololg and Elasticsearch logger error (Laravel, PHP8)

26 Views Asked by At

I have that code: app/Logging/ElasticsearchLogger.php

<?php

namespace App\Logging;

use Elasticsearch\ClientBuilder;
use Monolog\Handler\AbstractProcessingHandler;

class ElasticsearchLogger extends AbstractProcessingHandler
{
    protected $client;

    public function __construct(array $config)
    {
        parent::__construct();

        $this->client = ClientBuilder::create()
            ->setHosts([
                [
                    'host' => $config['elasticsearch_host'],
                    'port' => $config['elasticsearch_port'],
                ]
            ])
            ->build();
    }

    protected function write(array $record): void
    {
        $params = [
            'index' => $record['channel'],
            'type' => 'logs',
            'body' => [
                'timestamp' => $record['datetime']->format('Y-m-d H:i:s'),
                'level' => $record['level_name'],
                'message' => $record['message'],
            ],
        ];

        $this->client->index($params);
    }
}

and config/logging.php

...
'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single'],
            'ignore_exceptions' => false,
        ],

        ...
        'emergency' => [
            'path' => storage_path('logs/laravel.log'),
        ],
        'elasticsearch' => [
            'driver' => 'custom',
            'via' => App\Logging\ElasticsearchLogger::class,
            'elasticsearch_host' => env('ELASTICSEARCH_HOST'),
            'elasticsearch_port' => env('ELASTICSEARCH_PORT'),
            'elasticsearch_index' => 'max_log',
        ],        
    ],

];

Code that logs

public function toElastic($request)
    {
        Log::channel('elasticsearch')->info($request);
        return true;
    }

Sample $request:

array:5 [
  "status" => "success"
  "login" => "000"
  "timestamp" => "2024-02-23 06:50:07"
  "jwt" => "xxx.xxx"
  "url" => "http://localhost:9999/api/complete/xxx/id2?grant_type=jwt&code=xxx"
]

And error: Declaration of App\Logging\ElasticsearchLogger::write(array $record): void must be compatible with Monolog\Handler\AbstractProcessingHandler::write(Monolog\LogRecord $record): void

I have tried also:

<?php

namespace App\Logging;

use Monolog\Handler\AbstractProcessingHandler;
use Monolog\Logger;
use Monolog\Record\Record;

class ElasticsearchLogger extends AbstractProcessingHandler
{
    protected $client;

    public function __construct(array $config)
    {
        parent::__construct(Logger::DEBUG);

        $this->client = ClientBuilder::create()
            ->setHosts([
                [
                    'host' => $config['elasticsearch_host'],
                    'port' => $config['elasticsearch_port'],
                ]
            ])
            ->build();
    }

    protected function write(Record $record): void
    {
        $this->client->index([
            'index' => $record->getChannel(),
            'type' => 'logs',
            'body' => [
                'timestamp' => $record->getDatetime()->format('Y-m-d H:i:s'),
                'level' => $record->getLevelName(),
                'message' => $record->getMessage(),
            ],
        ]);
    }
}

0

There are 0 best solutions below