Personnaliser les logs dans Laravel : Créer un système de logs horaires
Laravel offre un système de journalisation puissant basé sur Monolog, qui permet une grande flexibilité pour personnaliser la manière dont les logs sont générés et stockés. Dans cet article, nous allons explorer comment créer un canal de log personnalisé pour générer des fichiers de logs horaires dans une application Laravel, en organisant les fichiers par date dans une structure de dossiers. Ce tutoriel s'appuie sur une configuration réelle pour illustrer le processus.
Pourquoi personnaliser les logs ?
Par défaut, Laravel propose plusieurs canaux de journalisation (comme single, daily, ou stack). Cependant, dans certains cas, vous pourriez vouloir une gestion plus granulaire, comme des logs séparés par heure pour faciliter le débogage ou l'analyse des performances sur des périodes spécifiques. Par exemple, un fichier de log par heure peut être utile pour une application à fort trafic où les logs doivent être segmentés pour une meilleure lisibilité.
Dans cet article, nous allons créer un canal de log personnalisé qui :
- Génère un fichier de log pour chaque heure (par exemple,
immo_14_2025-05-24.logpour 14h). - Organise les logs dans une structure de dossiers par date (par exemple,
storage/logs/2025/05/24/). - Utilise le niveau de journalisation
DEBUGpour capturer des informations détaillées.
Étape 1 : Configurer le canal de log dans Laravel
Laravel permet de définir des canaux de journalisation personnalisés dans le fichier config/logging.php. Voici une configuration pour un canal nommé custom :
'custom' => [ 'driver' => 'custom', 'via' => App\Logging\CustomLogFormatter::class, 'level' => 'debug',],
Explications :
driver: Utilise le drivercustom, qui indique à Laravel d'utiliser une classe personnalisée pour gérer ce canal.via: Pointe vers une classe (CustomLogFormatter) qui définit comment les logs seront traités.level: Définit le niveau minimum de journalisation (debugdans ce cas, pour capturer tous les niveaux de logs).
Étape 2 : Créer la classe de formatage personnalisée
Pour gérer la logique du canal custom, nous devons créer une classe qui configure Monolog. Placez le code suivant dans app/Logging/CustomLogFormatter.php :
<?php namespace App\Logging; use Monolog\Handler\StreamHandler;use Monolog\Logger; class CustomLogFormatter{ public function __invoke(array $config): Logger { $hour = date('H'); $date = date('Y-m-d'); $logDirectory = storage_path("logs/" . date('Y/m/d')); if (!is_dir($logDirectory)) { mkdir($logDirectory, 0775, true); } $logPath = "$logDirectory/immo_{$hour}_{$date}.log"; if (!file_exists($logPath)) { touch($logPath); chmod($logPath, 0664); } $handler = new StreamHandler($logPath, Logger::DEBUG); return new Logger('custom', [$handler]); }}
Explications :
- Namespace: La classe est placée dans le namespace
App\Loggingpour une organisation claire. - Méthode
__invoke: Cette méthode est appelée automatiquement par Laravel pour configurer le canal de log. Elle retourne une instance deMonolog\Logger. - Structure des dossiers: Les logs sont organisés dans
storage/logs/YYYY/MM/DD/(par exemple,storage/logs/2025/05/24/). - Nom des fichiers: Chaque fichier est nommé selon le format
immo_{heure}_{date}.log(par exemple,immo_14_2025-05-24.logpour 14h le 24 mai 2025). - Permissions: Les dossiers sont créés avec
0775et les fichiers avec0664pour garantir l'accès tout en maintenant la sécurité. - Handler: Un
StreamHandlerest utilisé pour écrire les logs dans le fichier spécifié, avec le niveauDEBUG.
Étape 3 : Configurer le canal par défaut
Pour activer le canal custom comme canal de journalisation par défaut, modifiez le fichier .env :
LOG_CHANNEL=custom
Cela indique à Laravel d'utiliser votre canal personnalisé pour toutes les opérations de journalisation.
Étape 4 : Tester le système de logs
Pour tester votre configuration, vous pouvez ajouter une journalisation dans votre code. Par exemple, dans un contrôleur :
use Illuminate\Support\Facades\Log; public function testLogging(){ Log::info('Test de journalisation à ' . now()); return 'Log créé !';}

Exécutez cette méthode (par exemple, via une route /test-log). Vous devriez voir un fichier créé dans storage/logs/2025/05/24/ avec un nom comme immo_14_2025-05-24.log (si exécuté à 14h). Le contenu du fichier ressemblera à ceci :
[2025-05-24 14:23:45] custom.INFO: Test de journalisation à 2025-05-24 14:23:45
Étape 5 : Personnaliser davantage (optionnel)
Vous pouvez enrichir cette configuration en :
- Ajoutant un formatage personnalisé : Modifiez le
StreamHandlerpour utiliser unLineFormatteravec un format de log spécifique.$formatter = new \Monolog\Formatter\LineFormatter("[%datetime%] %level_name%: %message% %context% %extra%\n");$handler->setFormatter($formatter); - Rotation des logs : Implémentez une tâche planifiée (via Laravel Scheduler) pour supprimer les anciens fichiers de logs après un certain temps.
- Ajout de métadonnées : Passez des informations contextuelles supplémentaires via
Log::withContext()pour enrichir vos logs.
Bonnes pratiques
- Vérifiez les permissions : Assurez-vous que le dossier
storage/logset ses sous-dossiers sont accessibles en écriture par le serveur web. - Surveillez la taille des logs : Les logs horaires peuvent générer beaucoup de fichiers. Pensez à une stratégie de rotation ou d'archivage.
Conclusion
La personnalisation des logs dans Laravel est un excellent moyen d’adapter la journalisation à vos besoins spécifiques. En utilisant un canal personnalisé, vous pouvez organiser les logs de manière granulaire, comme dans cet exemple avec des fichiers horaires triés par date. Cette approche améliore la lisibilité et facilite l’analyse des journaux dans des projets complexes.
lesage