Ajouter des informations additionnelles aux logs d'erreur Symfony

Publié le 19/03/2019 • Mis à jour le 19/03/2019

English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧

Quand un bug survient, il est parfois difficile d'en identifier la source. Avoir plus de contexte permet de trouver et de pouvoir reproduire les problèmes plus facilement. Dans l'exemple suivant nous allons ajouter quelques informations de configuration de l'application. Et, si un objet Request est disponible nous allons ajouter l'URI courante ainsi que le referer s'ils existent. Le service EnvProcessor doit être tagué avec monolog.processor et déclaré dans le fichier services.yaml. Enfin vous devrez "binder" ces paramètres pour qu'ils puissent être identifiés. (uniquement le paramètre $appEnv (APP_ENV) est commun aux applications Symfony4 / Flex)


<?php declare(strict_types=1);

// src/Log/Processor/EnvProcessor.php

namespace App\Log\Processor;

use Symfony\Component\HttpFoundation\IpUtils;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;

/**
 * Add extra data to logs.
 *
 * @see http://symfony.com/doc/current/logging/processors.html
 */
class EnvProcessor
{
    protected $appServer;
    protected $appEnv;
    protected $appVersion;
    protected $requestStack;

    /**
     * Check out the doc to see you to bind your parameters. In this case:
     * - "app_env" and "app_server" come from the ".env" file and are made available in services.yaml:
     * - app_env: '%env(APP_ENV)%'
     * - "app_version" comes from "services.yaml"
     * - "$requestStack" is the standard Symfony value object.
     *
     * @see https://symfony.com/doc/current/service_container.html#binding-arguments-by-name-or-type
     */
    public function __construct(string $appEnv, string $appServer, string $appVersion, RequestStack $requestStack)
    {
        $this->appEnv = $appEnv;
        $this->appServer = $appServer;
        $this->appVersion = $appVersion;
        $this->requestStack = $requestStack;
    }

    /**
     * Add environment extra data to the log record to ease debug.
     */
    public function __invoke(array $record): array
    {
        $record['extra']['app_server'] = $this->appServer;
        $record['extra']['app_env'] = $this->appEnv;
        $record['extra']['app_version'] = $this->appVersion;

        $request = $this->requestStack->getCurrentRequest();
        if ($request instanceof Request) {
            $uri = $request->getUri();
            if ($uri) {
                $record['extra']['uri'] = $uri;
            }

            $referer = $request->headers->get('referer');
            if ($referer) {
                $record['extra']['referer'] = $referer;
            }

            $ip = $request->getClientIp();
            if ($ip) {
                $record['extra']['ip'] = IpUtils::anonymize($ip);
            }
        }

        return $record;
    }
}

 Plus sur Stackoverflow   Lire la doc