Как в Symfony добавить дополнительные данные в лог сообщений Монолога через специальный процессор?

Monolog позволяет обрабатывать каждую запись лога перед ее сохранением в лог, и добавлять дополнительные данные. Это роль процессора, который можно применять для всего стека обработчиков или только для определенного обработчика или канала.

Процессор — это вызываемый объект, получающий запись лога в качестве первого аргумента. Процессоры настраиваются с помощью тега DIC monolog.processor.

Добавление токена сессии/запроса

Иногда трудно сказать, какие записи в журнале принадлежат какому сеансу и / или запросу. В следующем примере добавляется уникальный токен для каждого запроса с использованием процессора:

namespace App\Logger;

use Symfony\Component\HttpFoundation\Session\SessionInterface;

class SessionRequestProcessor
{
    private $session;
    private $sessionId;

    public function __construct(SessionInterface $session)
    {
        $this->session = $session;
    }

    // this method is called for each log record; optimize it to not hurt performance
    public function __invoke(array $record)
    {
        if (!$this->session->isStarted()) {
            return $record;
        }

        if (!$this->sessionId) {
            $this->sessionId = substr($this->session->getId(), 0, 8) ?: '????????';
        }

        $record['extra']['token'] = $this->sessionId.'-'.substr(uniqid('', true), -8);

        return $record;
    }
}

Затем зарегистрируйте свой класс как сервис, а также как форматтер, который использует дополнительную информацию:

# config/services.yaml
services:
    monolog.formatter.session_request:
        class: Monolog\Formatter\LineFormatter
        arguments:
            - "[%%datetime%%] [%%extra.token%%] %%channel%%.%%level_name%%: %%message%% %%context%% %%extra%%\n"

    App\Logger\SessionRequestProcessor:
        tags:
            - { name: monolog.processor }

Наконец, установите форматер для использования с любым обработчиком, который вы хотите:

# config/packages/prod/monolog.yaml
monolog:
    handlers:
        main:
            type: stream
            path: '%kernel.logs_dir%/%kernel.environment%.log'
            level: debug
            formatter: monolog.formatter.session_request

Если вы используете несколько обработчиков, вы также можете зарегистрировать процессор на уровне обработчика или на уровне канала вместо того, чтобы регистрировать его глобально.

MonologBridge Symfony предоставляет процессоры, которые могут быть зарегистрированы в вашем приложении:

  • DebugProcessor. Добавляет дополнительную информацию, полезную для отладки, такую как отметка времени или сообщение об ошибке в запись.
  • TokenProcessor. Добавляет информацию из токена текущего пользователя в запись, а именно имя пользователя, роли и подлинность пользователя.
  • WebProcessor. Переопределяет данные из запроса, используя данные внутри объекта запроса Symfony.
  • RouteProcessor. Добавляет информацию о текущем маршруте (контроллер, действие, параметры маршрута).
  • ConsoleCommandProcessor. Добавляет информацию о текущей команде консоли.

Регистрация процессоров для каждого обработчика.

Вы можете зарегистрировать процессор для каждого обработчика, используя опцию обработчика тега monolog.processor:

# config/services.yaml
services:
    App\Logger\SessionRequestProcessor:
        tags:
            - { name: monolog.processor, handler: main }

Регистрация процессоров на канал.

Вы можете зарегистрировать процессор для каждого канала, используя параметр канала тега monolog.processor:

# config/services.yaml
services:
    App\Logger\SessionRequestProcessor:
        tags:
            - { name: monolog.processor, channel: main }

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *