Formation PUB030 : Laravel, 2019 Déboguer une application Laravel

17.6 logd() : une fonction maison pour consigner des message de débogage seulement lors du développement


Lorsque vous ajoutez des informations de débogage dans le fichier laravel.log, il y a peu de risques que des utilisateurs malveillants mettent la main sur des informations sensibles et ce, même si ces informations continuent à être consignées une fois le site en ligne. C'est la structure des dossiers de Laravel qui offre cette protection : le fichier laravel.log n'est pas situé sous le dossier public (la racine du site Web) donc il n'est pas accessible par le Web.

Pourtant, le fait d'enregistrer ces informations pour un site en ligne consomme du temps de traitement inutilement. De plus, ces informations créent de la pollution dans le fichier laravel.log, qui peut être utile pour détecter différentes problématiques même lorsque le liste est en ligne. Voilà pourquoi il est important de supprimer les appels à Log::debug() une fois que vous avez obtenu l'information pour vous aider à déboguer.

Mais puisqu'un oubli est si vite arrivé, il vaut mieux prendre des précautions pour qu'en cas d'oubli, les informations de débogage ne soient pas consignées. Voici deux techniques pour y arriver.

▼Publicité Le texte se poursuit plus bas

Niveau de sévérité minimal des informations à consigner

Dans le fichier config/logging.php, vous pouvez configurer à partir de quel niveau de sévérité les informations doivent être consignées dans le fichier laravel.log. Lorsqu'un site est en ligne, ceci permet de limiter le nombre d'informations consignées afin de ne pas alourdir inutilement le fichier laravel.log.

Notez qu'avant Laravel 5.6, le niveau de sévérité était configuré à l'aide de la constante APP_LOG_LEVEL dans le fichier .env.

Depuis Laravel 5.6, pour savoir où configurer le niveau de sévérité minimal des informations à consigner, il faut partir du fichier .env. Dans ce fichier, la constante LOG_CHANNEL est configurée par défaut à stack. Ceci signifie qu'il faut rechercher la configuration stack dans le fichier config/logging.php.

On voit que stack indique qu'un seul canal est utilisé : single (dans certaines version, on retrouve plutôt daily). Et plus bas, on voit que single est configuré à debug. C'est cette valeur qu'il faudra changer lors de la mise en ligne.

Ex :

Fichier config/logging.php

return [

    ...

    'channels' => [

        ...

        'stack' => [

            ...

            'channels' => ['single'],

        ],

        'single' => [

            ...

            'level' => 'debug',

        ],

    ],

];

Les différents niveaux de sévérité possibles sont, dans l'ordre :

  1. debug
  2. info
  3. notice
  4. warning
  5. error
  6. critical
  7. alert
  8. emergency

Si vous souhaitez que toutes les erreurs soient consignées, à l'exception bien sûr des informations de débogage, vous configurerez le niveau à info.

Ex :

Fichier config/logging.php

return [

    ...

    'channels' => [

        ...

        'stack' => [

            ...

            'channels' => ['single'],

        ],

        'single' => [

            ...

            'level' => 'info',

        ],

    ],

];

Il est également possible de configurer cette constante à un niveau plus élevé, par exemple error, afin de diminuer encore plus le nombre de messages dans le fichier laravel.log.

Fonction maison

Une autre technique, complémentaire à la première, consiste à créer une fonction de débogage qui fera un appel à Log::debug() seulement si la directive de débogage (APP_DEBUG dans le fichier .env) est à true.

Ceci semble inutile puisque le fait de modifier la configuration du niveau de sévérité minimal aura le même effet. Pourtant, il reste un avantage intéressant : vous aurez moins de caractères à taper à chaque fois que vous désirez l'utiliser (logd() vs Log::debug()).

Voici le code de cette fonction :

Fichier app/fonctions/debogage.php (PHP)

/**

 * Fait un Log::debug seulement si en mode débogage.

 * Source : christianelagace.com

 *

 * @param  mixed $message

 * @param  array  $context

 * @return void

 */

function logd($message, array $context = []) : void

{

    if (Config::get('app.debug')) {

        \Log::debug($message, $context);

    }

}

Pour l'utiliser, il faudra avoir pris soin d'ajouter une référence au fichier de débogage (avec un include_once() pour un contrôleur ou à l'aide d'une configuration dans composer.json pour l'ensemble de l'application).

Contrôleur Laravel (PHP)

logd($produits);

Un autre exemple, cette fois avec deux paramètres. logd() s'utilise donc exactement de la même façon que Log::debug().

Contrôleur Laravel (PHP)

logd('Données : ', compact('produits', 'factures');

Déboguer une vue

Les instructions HTML et Blade d'une vue ne peuvent pas être déboguées à l'aide d'un débogueur standard. La fonction logd() pourra vous être utile pour vérifier par exemple la valeur des variables reçues du contrôleur ou encore les valeurs dans chaque itéraiton d'une instruction foreach().

Ex :

Blade

@foreach($produits as $produit)

    @php

        logd($produit->images);

    @endphp

@endforeach

Pour plus d'information

« Errors & Logging - Log Severity Levels ». Laravel. https://laravel.com/docs/master/errors#log-severity-levels

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Par Christiane Lagacé
Dernière révision le 22 février 2019
Merci de partager !

Site fièrement hébergé chez A2 Hosting.

Soumettre