Adicionando integração com rabbitmq

production 0.1.8
José Neto 2 years ago
parent c059c3e33a
commit 663b6bd26a

@ -10,7 +10,8 @@
"ext-json": "*",
"spatie/data-transfer-object": ">=2.8",
"pusher/pusher-php-server": ">=4.0",
"guzzlehttp/guzzle": ">=7.0"
"guzzlehttp/guzzle": ">=7.0",
"php-amqplib/php-amqplib": "*"
},
"autoload": {
"psr-4": {

952
composer.lock generated

File diff suppressed because it is too large Load Diff

@ -0,0 +1,74 @@
<?php
namespace Ae3\LaravelLogsLayer\app\Handlers;
use Exception;
use Monolog\Handler\AbstractProcessingHandler;
use PhpAmqpLib\Channel\AbstractChannel;
use PhpAmqpLib\Channel\AMQPChannel;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
class RabbitMQHandler extends AbstractProcessingHandler
{
/**
* @var AMQPStreamConnection
*/
private AMQPStreamConnection $connection;
/**
* @var AbstractChannel|AMQPChannel
*/
private $channel;
/**
* @var mixed|string
*/
private $exchange;
/**
* @var mixed|string
*/
private $routingKey;
/**
* @throws Exception
*/
public function __construct($exchange = 'logs', $routingKey = 'log', $level = \Monolog\Level::ERROR, $bubble = true)
{
parent::__construct($level, $bubble);
$this->connection = new AMQPStreamConnection(
config('logging.channels.rabbitmq.host'),
config('logging.channels.rabbitmq.port'),
config('logging.channels.rabbitmq.username'),
config('logging.channels.rabbitmq.password')
);
$this->channel = $this->connection->channel();
$this->exchange = $exchange;
$this->routingKey = $routingKey;
$this->channel->exchange_declare($exchange, 'direct', false, true, false);
}
/**
* @param array $record
* @return void
*/
public function write(array $record): void
{
$data = json_encode($record);
$msg = new AMQPMessage($data, [
'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT
]);
$this->channel->basic_publish($msg, $this->exchange, $this->routingKey);
}
/**
* @return void
* @throws Exception
*/
public function close(): void
{
$this->channel->close();
$this->connection->close();
}
}

@ -0,0 +1,42 @@
<?php
namespace Ae3\LaravelLogsLayer\app\Loggers;
use Ae3\LaravelLogsLayer\app\Exceptions\MissingConfigurationException;
use Ae3\LaravelLogsLayer\app\Handlers\RabbitMQHandler;
use Exception;
use Monolog\Logger;
class RabbitMQLogger extends AbstractLogger
{
/**
* @param array $config
* @return void
* @throws MissingConfigurationException
*/
public function validateConfig(array $config): void
{
$requiredKeys = ['host', 'port', 'username', 'password'];
foreach (array_merge($requiredKeys, $this->requiredKeys) as $key) {
if (!array_key_exists($key, $config)) {
throw new MissingConfigurationException("Missing configuration key: $key in rabbitmq channel");
}
}
}
/**
* @throws Exception
*/
public function createLogger(array $config): Logger
{
$handler = new RabbitMQHandler(
$config['exchange'] ?? 'logs',
$config['routing_key'] ?? 'log',
$config['level'] ?? Logger::DEBUG,
$config['bubble'] ?? true
);
return new Logger('rabbitmq', [$handler]);
}
}
Loading…
Cancel
Save