Journalisation Laravel : tout ce que vous devez savoir

Publié: 2022-08-19

Lors du développement d'une application moderne, la journalisation doit figurer en tête de liste des priorités.

La journalisation permet de visualiser votre application à la fois en développement et en production, ce qui permet transparence et visibilité. Avec une journalisation correctement structurée, les applications modernes peuvent devenir plus faciles à entretenir car nous pouvons identifier de manière proactive les points de défaillance et les goulots d'étranglement des performances dans notre application.

Le framework Laravel est livré avec un système de journalisation robuste qui gère tous les obstacles impliqués dans la configuration d'un système de journalisation correctement structuré prêt à l'emploi. Ce nouveau système de journalisation introduit dans Laravel 6.5 est puissant et nous l'explorerons dans cet article.

Cet article explorera les bases de la journalisation Laravel et pourquoi vous devriez utiliser la journalisation Laravel dans votre prochain projet. Nous discuterons en détail de la journalisation structurée et de la journalisation centralisée. De plus, nous apprendrons comment implémenter la journalisation Laravel en créant une application Todo.

Vous tirerez plus de cet article si vous avez déjà ce qui suit à votre actif :

  • Bonne connaissance du développement web
  • Compréhension de base de Laravel
  • Créer des applications avec Laravel

Qu'est-ce que la journalisation Laravel ?

La journalisation Laravel concerne la façon dont Laravel gère la journalisation, ou le signalement automatique des problèmes, à l'aide d'un système de journalisation PHP viral appelé Monolog. Cependant, en raison de la philosophie de Laravel consistant à utiliser des bibliothèques existantes populaires pour implémenter différentes fonctionnalités de framework, Laravel utilise Monolog pour tous ses besoins de journalisation.

Monolog est une bibliothèque de journalisation PHP très flexible et populaire que nous pouvons configurer pour envoyer vos journaux vers des fichiers, des sockets, des bases de données et d'autres services Web. Monolog fournit une interface familière pour écrire des journaux à partir de fichiers texte standard vers des services de gestion de journaux tiers avancés. Laravel configure généralement Monolog pour utiliser un fichier de configuration de journalisation standard.

Pour plus d'informations sur Monolog et ses fonctionnalités, consultez la documentation officielle, car cela dépasse le cadre de cet article.

Avant de plonger dans la configuration et la mise en œuvre de la journalisation Laravel à l'aide de Monolog, explorons d'autres raisons d'utiliser la journalisation Laravel et les différents types.

Pourquoi utiliser la journalisation Laravel ?

Pourquoi la journalisation est-elle nécessaire ?

Le manifeste de l'application Twelve-Factor traite la journalisation comme l'une des préoccupations essentielles d'une application moderne, car la journalisation est la clé des performances et de la surveillance.

Les journaux aident à comprendre en détail les erreurs qui se produisent en production et leur origine. De plus, avec des structures de journal appropriées, il peut montrer l'utilisateur particulier, l'action qui a causé l'erreur et la solution possible pour une correction de bogue et une maintenance plus rapides.

La journalisation structurée est une bouée de sauvetage dans les applications de production en aidant à dépanner les défauts et à résoudre les problèmes de production. De plus, vous pouvez surveiller et collecter tous vos messages de journal en temps réel à l'aide d'outils de journalisation spécialisés pour l'analyse et la création de rapports en direct.

Pour ces raisons, vous devez faire de la journalisation structurée une priorité absolue dans votre prochain projet d'application moderne.

Regardons la vue d'ensemble des différents styles de journalisation disponibles.

Bases de la journalisation Laravel

Apprendre les bases de la journalisation vous aidera à comprendre comment Laravel gère la journalisation et comment vous pouvez améliorer vos pratiques de journalisation structurées.

Examinons deux concepts essentiels de la journalisation pour mieux comprendre comment mettre en œuvre nos procédures de journalisation.

Journalisation structurée Laravel

Dans le développement de logiciels, la journalisation structurée met en œuvre un format de message prédéterminé et cohérent pour les journaux d'application. Ce format permet aux messages d'être traités comme des données qui peuvent être surveillées, manipulées et visualisées bien mieux que le format texte normal.

Vous devez implémenter une approche de journalisation structurée dans le développement de votre application moderne, car les fichiers journaux sont les actifs essentiels pour les développeurs lorsqu'un problème survient dans votre application en production.

Étant donné que Laravel utilise Monolog, les développeurs peuvent rapidement mettre en œuvre une journalisation structurée en configurant l'enregistreur pour recevoir des types d'informations spécifiques, en stockant les fichiers journaux dans différents formats et en envoyant les journaux à divers services de gestion de journaux tiers pour visualisation.

Journalisation centralisée de Laravel

Un système de journalisation centralisé est l'endroit où les journaux sont envoyés aux solutions de gestion centralisée des journaux (CLM) à partir de plusieurs sources pour une consolidation et une visualisation faciles. Cependant, CLM est une solution d'enregistrement spécialisée qui collecte les messages de journal de différentes sources et consolide les données pour un traitement et une visualisation faciles.

Outre la collecte de données, CLM devrait également prendre en charge l'analyse des données de journal et une présentation claire des données après analyse.

Journalisation structurée vs journalisation de base

Examinons la différence entre la journalisation structurée et la journalisation de base (non structurée) et pourquoi vous devriez utiliser la journalisation structurée dans votre projet Laravel.

Journalisation de base

Dans la journalisation de base, les fichiers journaux sont stockés dans un format brut avec des données limitées pour interroger et identifier les journaux individuels.

Lors de l'utilisation de la journalisation de base, les développeurs ne pourront pas utiliser d'outils d'analyse tiers pour lire, afficher et analyser les journaux, sauf s'ils développent un outil personnalisé ou s'en tiennent à un outil limité prenant en charge leur format de journal.

Il existe trois grandes raisons d'éviter d'utiliser la journalisation de base :

  1. Les systèmes de gestion centralisée des journaux ne peuvent pas travailler avec les données sans support supplémentaire.
  2. Une solution personnalisée est nécessaire pour lire et analyser les données d'une solution de journalisation de base.
  3. Il peut être difficile pour les administrateurs de lire les données de journalisation de base car elles sont brutes et non structurées.

Journalisation structurée

La journalisation structurée fait gagner du temps aux développeurs en utilisant des outils d'analyse de journaux tiers open source qui prennent en charge la structure de journal standard pour lire, afficher et analyser les journaux.

Les journaux sont utiles s'ils contiennent les données correctes répertoriées ci-dessous, ce que vise la journalisation structurée. Nous pouvons utiliser les données incluses dans la journalisation structurée pour créer des tableaux de bord, des graphiques, des diagrammes et toute autre visualisation utile pour déterminer la santé de l'application.

Ce sont des exemples de base des informations que nous pouvons inclure dans les messages de journal structurés. De plus, vous pouvez entièrement personnaliser les données en fonction de vos besoins.

Voici quelques exemples de données que vous pouvez collecter avec la journalisation structurée :

  1. Le port utilisé pour exécuter la fonction
  2. La date et l'heure à laquelle l'événement s'est produit
  3. Le nom d'utilisateur ou l'identifiant du client
  4. Une description de l'événement (message de journal)
  5. Le protocole utilisé pour exécuter la fonction
  6. L'emplacement de l'événement déclenché (indiquer l'API ou l'application en cours d'exécution)
  7. L'identifiant unique de l'événement
  8. Le type d'action déclenchée (niveau du journal)

Les journaux doivent contenir suffisamment de données pour visualiser facilement la solution ou la raison de l'événement de journal. Notez également que vous ne devez pas stocker tous les types d'informations, tels que les mots de passe ou les données sensibles dans les journaux.

Maintenant que nous avons entrevu ce qu'est la journalisation Laravel, passons à la mise en œuvre de la journalisation Laravel en créant une application avec la journalisation en tant que citoyen de première classe.

Comment mettre en œuvre la journalisation Laravel avec l'application Todo

Nous allons maintenant appliquer ce que nous avons appris jusqu'à présent en créant un nouveau projet Laravel et en implémentant la journalisation Laravel.

Si vous n'avez jamais utilisé Laravel auparavant, vous pouvez lire ce qu'est Laravel ou consulter notre liste d'excellents tutoriels Laravel pour commencer.

Configurer Laravel

Tout d'abord, nous allons créer une nouvelle instance Laravel à l'aide de la commande ci-dessous. Vous pouvez consulter la documentation officielle pour en savoir plus.

Ouvrez votre console et accédez à l'endroit où vous stockez vos projets PHP avant d'exécuter les commandes ci-dessous. Assurez-vous que Composer est installé et configuré correctement.

 composer create-project laravel/laravel laravel-logging-app cd laravel-logging-app // Change directory to current Laravel installation php artisan serve // Start Laravel development server

Configuration et amorçage de la base de données

Ensuite, nous allons configurer notre base de données, créer un nouveau modèle Todo et ensemencer 200 fausses données à tester.

Ouvrez votre client de base de données et créez une nouvelle base de données. Nous ferons de même avec le nom laravel_logging_app_db puis remplirons notre fichier .env avec les informations d'identification de la base de données :

 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_logging_app_db DB_USERNAME=//DB USERNAME HERE DB_PASSWORD=//DB PASSWORD HERE

Ensuite, nous allons exécuter la commande suivante pour créer simultanément la migration et le modèle Todo :

 php artisan make:model Todo -mc

Ouvrez la nouvelle migration trouvée database/migrations/xxx-create-todos-xxx.php et collez les codes suivants :

 <?php use IlluminateSupportFacadesSchema; use IlluminateDatabaseSchemaBlueprint; use IlluminateDatabaseMigrationsMigration; class CreateTodosTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('todos', function (Blueprint $table) { $table->id(); $table->string('title'); $table->text('description')->nullable(); $table->boolean('is_completed')->default(false); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('todos'); } }

Vous pouvez ensemencer vos tâches avec des données factices en apprenant à ensemencer vos bases de données dans Laravel à l'aide de Faker.

Aux prises avec des temps d'arrêt et des problèmes WordPress ? Kinsta est la solution d'hébergement conçue pour vous faire gagner du temps ! Découvrez nos fonctionnalités

Présentation de Monolog

Avec Laravel Monolog, vous pouvez diffuser et envoyer des journaux structurés vers différents canaux tels que les e-mails, Slack, les fichiers, les sockets, les boîtes de réception, les bases de données et divers services Web. Dans Laravel, vous pouvez configurer la journalisation à partir d'un seul fichier de configuration situé dans config/logging.php .

Le fichier de configuration est fourni avec des pilotes de journal prédéfinis parmi lesquels choisir, et le pilote par défaut est une stack qui utilise le canal single pour se connecter à un fichier laravel.log trouvé dans le dossier storage/logs . Nous allons démontrer la journalisation structurée en utilisant quelques pilotes de journal Laravel.

Laravel fournit une poignée de méthodes pour interagir avec les journaux, comme le montre généralement le fichier de contrôleur TodosController.php sous peu.

Écriture de messages de journal dans le contrôleur

Ouvrez le nouveau fichier de contrôleur TodosController.php trouvé dans le dossier app/Http/Controllers et collez les codes suivants :

 <?php namespace AppHttpControllers; use AppModelsTodo; use IlluminateHttpRequest; use AppHttpControllersController; use IlluminateSupportFacadesAuth; use IlluminateSupportFacadesLog; class TodosController extends Controller { public function index(Request $request) { $todos = Todo::all(); Log::warning('User is accessing all the Todos', ['user' => Auth::user()->id]); return view('dashboard')->with(['todos' => $todos]); } public function byUserId(Request $request) { $todos = Todo::where('user_id', Auth::user()->id)->get(); Log::info('User is accessing all his todos', ['user' => Auth::user()->id]); return view('dashboard')->with(['todos' => $todos]); } public function show(Request $request, $id) { $todo = Todo::find($id); Log::info('User is accessing a single todo', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show')->with(['todo' => $todo]); } public function update(Request $request, $id) { # Validations before updating $todo = Todo::where('user_id', Auth::user()->id)->where('id', $id)->first(); Log::warning('Todo found for updating by user', ['user' => Auth::user()->id, 'todo' => $todo]); if ($todo) { $todo->title = $request->title; $todo->desc = $request->desc; $todo->status = $request->status == 'on' ? 1 : 0; if ($todo->save()) { Log::info('Todo updated by user successfully', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show', ['todo' => $todo]); } Log::warning('Todo could not be updated caused by invalid todo data', ['user' => Auth::user()->id, 'todo' => $todo->id, 'data' => $request->except('password')]); return; // 422 } Log::error('Todo not found by user', ['user' => Auth::user()->id, 'todo' => $id]); return; // 401 } public function store(Request $request) { Log::warning('User is trying to create a single todo', ['user' => Auth::user()->id, 'data' => $request->except('password')]); # Validations before updating $todo = new Todo; $todo->title = $request->title; $todo->desc = $request->desc; $todo->user_id = Auth::user()->id; if ($todo->save()) { Log::info('User create a single todo successfully', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show', ['todo' => $todo]); } Log::warning('Todo could not be created caused by invalid todo data', ['user' => Auth::user()->id, 'data' => $request->except('password')]); return; // 422 } public function delete(Request $request, $id) { Log::warning('User is trying to delete a single todo', ['user' => Auth::user()->id, 'todo' => $id]); $todo = Todo::where('user_id', Auth::user()->id)->where('id', $id)->first(); if ($todo) { Log::info('User deleted a single todo successfully', ['user' => Auth::user()->id, 'todo' => $id]); $todo->delete(); return view('index'); } Log::error('Todo not found by user for deleting', ['user' => Auth::user()->id, 'todo' => $id]); return; // 404 } }

Dans chacune des méthodes du TodoController , nous avons ajouté la façade Log avec un niveau de journalisation spécifique pour définir le type d'erreur que nous voulons envoyer. Vous trouverez ci-dessous un exemple d'utilisation de

Log façade dans la méthode du store .

 public function store(Request $request) { Log::warning('User is trying to create a single todo', ['user' => Auth::user()->id, 'data' => $request->except('password')]); # Validations before updating $todo = new Todo; $todo->title = $request->title; $todo->desc = $request->desc; $todo->user_id = Auth::user()->id; if ($todo->save()) { Log::info('User create a single todo successfully', ['user' => Auth::user()->id, 'todo' => $todo->id]); return view('show', ['todo' => $todo]); } Log::warning('Todo could not be created caused by invalid todo data', ['user' => Auth::user()->id, 'data' => $request->except('password')]); return; // 422 }

Formatage des messages du journal

Supposons que vous n'êtes pas à l'aise avec le LineFormatter par défaut utilisé par Laravel, qui fait un excellent travail en fournissant des messages lisibles et utiles.

Dans ce cas, vous pouvez facilement faire tourner un objet formateur personnalisé pour l'adapter à votre cas d'utilisation et l'utiliser dans toute l'application.

La documentation officielle de Monolog donne une liste complète des formateurs disponibles et peut facilement en créer un personnalisé.

Dans Laravel, vous pouvez facilement configurer l'un des pilotes pour utiliser votre formateur personnalisé en l'ajoutant à la liste comme ci-dessous dans le fichier de configuration situé dans config/logging.php :

 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), 'days' => 14, 'formatter' => MonologFormatterHtmlFormatter::class, 'formatter_with' => [ 'dateFormat' => 'Ym-d', ] ],

L'exemple ci-dessus ajoute un MonologFormatterHtmlFormatter personnalisé au pilote daily en utilisant le formatter et la clé formatter_with dans la configuration du canal daily pour modifier le format des dates.

Envoi de journaux à différents canaux

Avec l'aide de Monolog, Laravel peut envoyer des journaux à différents canaux et à plusieurs canaux simultanément.

Montrons comment envoyer des journaux à notre canal Slack en suivant ces étapes simples. Changez le canal de journalisation par défaut en Slack et ajoutez l'URL Slack Webhook dans votre fichier .env .

 LOG_CHANNEL=slack LOG_SLACK_WEBBHOOK_URL= Slack_webhook_url_here

Ensuite, testez votre configuration en enregistrant un message dans votre application à l'aide de la façade Log comme celle illustrée ci-dessous :

 Log::debug("The API instance is on fire caused by:", ['user' => 1])

Vous pouvez ouvrir votre canal Slack pour vérifier l'erreur imprimée dans le canal souhaité que vous avez spécifié lors de la génération de l'URL Webhook.

Sommaire

La journalisation est aussi importante que tout autre facteur de votre application, sinon plus. C'est pourquoi il est suggéré par le manifeste Twelve-Factor App comme l'une des préoccupations les plus critiques de toute application moderne.

Avec une journalisation efficace, vous pouvez facilement lire, afficher et visualiser les erreurs et les défauts qui se produisent dans votre application prête pour la production. À cette fin, il est important que vous mettiez en œuvre une journalisation structurée dans votre application dès le début du projet.

Dans cet article, nous avons exploré la journalisation Laravel et pourquoi vous devriez l'utiliser dans votre prochain projet. Nous avons discuté en détail de la journalisation structurée et de la journalisation centralisée. De plus, nous avons appris à implémenter la journalisation Laravel en créant une application Todo.

Comment prévoyez-vous d'implémenter la connexion à votre prochaine application ? Faites-nous savoir dans la section des commentaires.