5 min de lecture
15 vues

Créer un système de logs horaires

Créer un système de logs horaires

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.log pour 14h).
  • Organise les logs dans une structure de dossiers par date (par exemple, storage/logs/2025/05/24/).
  • Utilise le niveau de journalisation DEBUG pour 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 driver custom, 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 (debug dans 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\Logging pour 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 de Monolog\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.log pour 14h le 24 mai 2025).
  • Permissions: Les dossiers sont créés avec 0775 et les fichiers avec 0664 pour garantir l'accès tout en maintenant la sécurité.
  • Handler: Un StreamHandler est utilisé pour écrire les logs dans le fichier spécifié, avec le niveau DEBUG.

É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 StreamHandler pour utiliser un LineFormatter avec 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/logs et 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.