
Очереди сообщений - неотъемлемая часть системы, находящейся под высокой нагрузкой. Они защищают приложения от разрушительного воздействия нагрузки, а также помогают легко масштабировать приложения.
Если система состоит из множества экземпляров приложений и / или некоторых устройств, это означает, что у вас также есть много производителей журналов. Таким образом, вы должны масштабировать систему ведения журнала по мере масштабирования приложения. В противном случае на механизм регистрации может повлиять внешняя нагрузка, он может быть безответственным и легко вывести из строя всю систему.
Вы также можете масштабировать системы регистрации, используя очереди сообщений. Сегодня я попытаюсь объяснить, как настроить RabbitMQ и Graylog для отправки журналов в Graylog из приложения Symfony через RabbitMQ.
Установка зависимостей Composer:
Установите RabbitMQBundle для доступа к экземпляру RabbitMQ из приложения.
$ composer require php-amqplib/rabbitmq-bundle
Определите соединение RabbitMQ с config.yml
# app/config/config.yml
...
old_sound_rabbit_mq:
connections:
logging:
host: '%rabbitmq_host%'
user: '%rabbitmq_user%'
password: '%rabbitmq_password%'
vhost: '%rabbitmq_logging_vhost%'
producers:
logging:
connection: logging
exchange_options:
name: logging
type: fanout
Определите учетные данные для подключения RabbitMQ в parameters.yml, которые описаны в config.yml
# app/config/parameters.yml parameters: ... rabbitmq_host: <your_rabbitmq_host_address> rabbitmq_user: <your_rabbitmq_user> rabbitmq_password: <your_rabbitmq_password> rabbitmq_logging_vhost: logging
Определите новый сервис для канала RabbitMQ, который будет использоваться monolog.
# app/config/services.yml
services:
...
monolog_mq_channel:
class: PhpAmqpLib\Channel\AMQPChannel
arguments:
- "@old_sound_rabbit_mq.connection.logging"
Определите обработчик монолога в файле конфигурации Symfony, как показано ниже. Для демонстрации мы будем использовать config_dev.yml Вы можете определить обработчики специально для каждой среды.
# app/config/config_dev.yml
monolog:
handlers:
console:
type: amqp
exchange: monolog_mq_channel
exchange_name: logging
level: warning
Теперь приложение готово к отправке логов в RabbitMQ. Давайте настроим экземпляр сервера RabbitMQ для приема сообщений.
Настроить RabbitMQ
В этом примере я предпочел создать конкретный виртуальный сервер, чтобы отделить приложение и журнал, связанные с зависимостями RabbitMQ. Вы можете проигнорировать этот шаг, если планируете использовать отдельный экземпляр RabbitMQ.
$ rabbitmqctl add_vhost logging $ rabbitmqctl set_permissions -p logging guest “.*” “.*” “.*”
Создайте новый обмен на RabbitMQ с именем, которое вы указали в конфигурации как производитель.
$ ./bin/console rabbitmq:setup-fabric
Теперь сервер RabbitMQ готов получать логи от приложения.
Настройте производитель журналов для демонстрации
Вы можете просто создать команду Symfony, как показано ниже, чтобы создать несколько записей журнала в очереди сообщений.
<?php
namespace AppBundle\Command;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class LoggingTestCommand extends ContainerAwareCommand
{
protected function configure()
{
$this->setName('logging:test')
->setDescription('Tester command for sending log over');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
/** @var LoggerInterface $logger */
$logger = $this->getContainer()->get('logger');
$output->writeln('Test messages are sending to message queue now. Please press CTRL+C to break this process.');
while(true) {
$logger->error('Some error occurred while doing sometihng.', [
'some_value' => 'ABC',
'another_value' => 1532,
]);
usleep(500);
}
}
}
Демо
Вызовите следующую команду, чтобы создать несколько журналов на сервере RabbitMQ.
$ ./bin/console logging:test
Как видно из следующего рисунка; приложение запускает отправку логов на сервер RabbitMQ.

Настроить Graylog
Войдите в свой Graylog как администратор и перейдите в раздел Inputs из меню System.

Выберите «GELF AMQP» из раскрывающегося списка в верхней части страницы и нажмите кнопку Launch new input (зеленая кнопка рядом с раскрывающимся списком).
Заполните поля ввода в открывшемся всплывающем окне следующими значениями:
Заголовок: ошибки
Общий: (установлен) (это означает, что все узлы в вашем кластере серого журнала будут использовать этот ввод в качестве источника)
Exchange: ведение журнала
Виртуальный хост брокера: ведение журнала
Очередь: testapp-logs
Имя хоста брокера: (Ваш адрес хоста rabbitmq)
Разрешить регулирование этого ввода: (отмечено) (Этот параметр обычно используется при чтении журналов из файла или очереди сообщений.)
Привязать к обмену: (отмечено) (это означает, что graylog автоматически привяжет очередь testapp-logs к вашему обмену.)
Ключ маршрутизации: #
Как видите, журналы начинают поступать из RabbitMQ в Graylog.

Вы можете найти этот пример и все настройки Graylog / RabbitMQ в следующем репозитории.
Спасибо за прочтение!