Filament Logs Explorer
Lisez et fouillez vos fichiers de logs Laravel sans quitter votre panel Filament, regroupés par canal de logging.
Compatibilité
| PHP | ^8.2 |
|---|---|
| Laravel | ^12.0|^13.0 |
| Filament | ^4.0|^5.0 |
| Version | v1.0.0 |
| Licence | MIT |
Installation
composer require laboiteacode/filament-logs-explorer
Présentation
Quand une erreur remonte en production, la lecture des logs passe encore trop souvent par un accès SSH, un tail -f et un peu de patience. Filament Logs Explorer déplace cette étape là où vous êtes déjà : dans votre panel d'administration.
Le plugin lit les fichiers de logs déclarés dans votre config/logging.php, et non un répertoire codé en dur. Vos canaux single, daily, les handlers de flux monolog et les membres d'un stack sont retrouvés automatiquement, puis présentés par canal. Un clic sur un fichier l'ouvre dans une visionneuse latérale, avec recherche interne, navigation entre les occurrences et raccourcis clavier.
Ce que ça change au quotidien
- Plus d'aller-retour vers le serveur pour consulter une trace : le fichier s'ouvre dans le panel, se cherche et se télécharge.
- Une lecture par canal, qui reflète la façon dont votre application journalise réellement, et pas un simple listing de répertoire.
- Un diagnostic au clavier :
/pour chercher,netNpour parcourir les occurrences,getGpour aller au début ou à la fin du fichier.
Pensé pour la production
Les fichiers volumineux ne font pas tomber le navigateur : au-delà d'une taille configurable, la visionneuse tronque le contenu et charge la fin du fichier, là où se trouvent les entrées les plus récentes, en signalant clairement la troncature.
Côté sécurité, le front ne manipule jamais de chemin de fichier : chaque fichier est référencé par un identifiant opaque et résolu côté serveur à partir de votre configuration de logging. L'accès à la page et la suppression de fichiers ont chacun leur propre autorisation, ce qui permet d'ouvrir la consultation des logs sans donner le droit d'effacer quoi que ce soit.
Le plugin est distribué sous licence MIT, et livré avec les traductions française, anglaise et espagnole.
Documentation
Installation
Installez le package avec Composer :
composer require laboiteacode/filament-logs-explorer
Enregistrez ensuite le plugin sur chaque panel où il doit apparaître, en général dans app/Providers/Filament/AdminPanelProvider.php :
use LaBoiteACode\FilamentLogsExplorer\FilamentLogsExplorerPlugin;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->plugin(FilamentLogsExplorerPlugin::make());
}
L'installation s'arrête là : une entrée Logs apparaît dans la navigation et liste tous les canaux basés sur des fichiers que le plugin a pu détecter.
Assets
Le CSS et le JS de la visionneuse sont enregistrés automatiquement auprès de Filament. En production, publiez-les comme n'importe quel asset Filament :
php artisan filament:assets
Fichiers publiables
Les trois groupes publiables sont facultatifs :
# config/filament-logs-explorer.php
php artisan vendor:publish --tag="filament-logs-explorer-config"
# lang/vendor/filament-logs-explorer/{locale}/filament-logs-explorer.php
php artisan vendor:publish --tag="filament-logs-explorer-translations"
# resources/views/vendor/filament-logs-explorer/
php artisan vendor:publish --tag="filament-logs-explorer-views"
Utilisation
La page Logs
La page affiche une section repliable par canal, chacune listant les fichiers les plus récents avec leur nom, leur taille et leur date de modification. Une action Rafraîchir dans l'en-tête relance l'analyse du disque.
Les fichiers que le processus ne peut pas lire restent listés, mais signalés comme illisibles : un problème de permissions se voit, au lieu de disparaître silencieusement.
La visionneuse
| Action | Comment |
|---|---|
| Chercher dans le fichier | Saisir dans le champ de recherche, les occurrences sont surlignées |
| Passer d'une occurrence à l'autre | Les boutons haut et bas, ou n et N |
| Aller au début ou à la fin | Les deux boutons dédiés, ou g et G |
| Ouvrir le fichier précédent ou suivant | Les boutons < et >, sans fermer le panneau |
| Placer le curseur dans la recherche | / |
| Télécharger le fichier brut | Le bouton de téléchargement |
| Supprimer le fichier | Le bouton corbeille, après confirmation |
Quand le champ de recherche a le focus, Entrée passe à l'occurrence suivante, Maj+Entrée à la précédente et Échap efface la recherche. Les raccourcis d'une seule lettre ne sont actifs qu'en dehors du champ : taper n dans une requête fait bien ce que vous attendez.
Gros fichiers
Les fichiers dépassant reader.max_bytes (5 Mo par défaut) sont tronqués. La visionneuse charge la fin du fichier, là où se trouvent les entrées les plus récentes, et affiche un bandeau expliquant la troncature et invitant à télécharger le fichier complet. Passez reader.tail_when_exceeded à false pour charger le début à la place.
Configuration
Chaque option se règle globalement dans le fichier config/filament-logs-explorer.php publié, ou par panel via l'API fluide du plugin. La valeur fluide l'emporte toujours, ce qui permet à plusieurs panels d'une même application d'exposer des sous-ensembles de logs différents.
Canaux
Par défaut, le plugin détecte tous les canaux basés sur des fichiers déclarés dans config/logging.php. Fournissez une liste explicite pour les restreindre et les ordonner :
// config/filament-logs-explorer.php
'channels' => ['daily', 'single'], // tableau vide => détection automatique
'exclude_channels' => ['emergency'],
'expand_stacks' => true, // éclate les canaux "stack" en leurs membres
'files_per_channel' => 15,
FilamentLogsExplorerPlugin::make()
->channels(['daily', 'single'])
->excludeChannels(['emergency'])
->expandStacks()
->filesPerChannel(20);
Fichiers non rattachés
Pour faire remonter aussi les fichiers *.log qui ne dépendent d'aucun canal, activez le balayage du répertoire. Ces fichiers sont regroupés dans leur propre section :
'discover_untracked_files' => true,
'log_directory' => null, // null => storage_path('logs')
'untracked_channel_label' => null, // null => le libellé traduit
FilamentLogsExplorerPlugin::make()
->discoverUntrackedFiles(directory: storage_path('logs'));
Navigation
FilamentLogsExplorerPlugin::make()
->navigationLabel('Logs applicatifs')
->navigationIcon('heroicon-o-bug-ant')
->activeNavigationIcon('heroicon-s-bug-ant')
->navigationGroup('Système')
->navigationSort(99)
->navigationParentItem('Outils')
->navigationBadge() // affiche le nombre de canaux en badge
->registerNavigation(false) // conserve la route, masque l'entrée de menu
->slug('logs-applicatifs');
Pour imbriquer la page dans un cluster Filament, passez le nom de sa classe :
FilamentLogsExplorerPlugin::make()
->cluster(SystemCluster::class);
Contrôle d'accès
La page est accessible à toute personne pouvant accéder au panel. Restreignez-la avec une capacité de Gate :
'authorization' => [
'gate' => 'view-logs',
],
Ou avec une closure, prioritaire sur le gate configuré :
FilamentLogsExplorerPlugin::make()
->canAccessUsing(fn (): bool => auth()->user()?->can('viewLogs') ?? false);
Dans les deux cas, cela pilote la méthode canAccess() de la page, donc la visibilité dans la navigation et l'autorisation de la route en même temps.
Suppression de fichiers
La suppression est active par défaut et dispose de sa propre autorisation, distincte de l'accès en lecture : vos utilisateurs peuvent consulter les logs sans pouvoir les effacer. Le bouton corbeille demande confirmation avant de retirer le fichier du disque, et supprimer le fichier ouvert ferme la visionneuse.
'deletion' => [
'enabled' => true,
'gate' => 'delete-logs', // null => toute personne pouvant accéder à la page
],
// Masquer complètement les boutons de suppression.
FilamentLogsExplorerPlugin::make()->deletable(false);
// Ou décider utilisateur par utilisateur.
FilamentLogsExplorerPlugin::make()
->canDeleteUsing(fn (): bool => auth()->user()?->can('deleteLogs') ?? false);
Lecteur
'reader' => [
'max_bytes' => 5 * 1024 * 1024,
'tail_when_exceeded' => true,
],
FilamentLogsExplorerPlugin::make()
->maxBytes(10 * 1024 * 1024)
->tailWhenExceeded();
Référence des options
| Clé de config | Méthode fluide | Défaut |
|---|---|---|
navigation.register |
registerNavigation() |
true |
navigation.label |
navigationLabel() |
« Logs » traduit |
navigation.icon |
navigationIcon() |
heroicon-o-document-magnifying-glass |
navigation.active_icon |
activeNavigationIcon() |
heroicon-s-document-magnifying-glass |
navigation.group |
navigationGroup() |
null |
navigation.sort |
navigationSort() |
null |
navigation.parent_item |
navigationParentItem() |
null |
navigation.badge |
navigationBadge() |
false |
slug |
slug() |
logs |
cluster |
cluster() |
null |
channels |
channels() |
[] (détection auto) |
exclude_channels |
excludeChannels() |
[] |
expand_stacks |
expandStacks() |
true |
discover_untracked_files |
discoverUntrackedFiles() |
false |
log_directory |
logDirectory() |
null (storage_path('logs')) |
untracked_channel_label |
aucune | null (libellé traduit) |
files_per_channel |
filesPerChannel() |
15 |
reader.max_bytes |
maxBytes() |
5242880 (5 Mo) |
reader.tail_when_exceeded |
tailWhenExceeded() |
true |
authorization.gate |
canAccessUsing() |
null |
deletion.enabled |
deletable() |
true |
deletion.gate |
canDeleteUsing() |
null |
Traductions
Le package est livré en français, anglais et espagnol, et suit la locale de votre application. Publiez les fichiers pour ajuster la formulation ou ajouter une langue :
php artisan vendor:publish --tag="filament-logs-explorer-translations"
Puis modifiez ou créez lang/vendor/filament-logs-explorer/{locale}/filament-logs-explorer.php.
Sécurité
La visionneuse ne lit que les fichiers qu'elle a elle-même résolus depuis votre configuration de logging. Le front référence les fichiers par un identifiant opaque et non réversible plutôt que par leur chemin : un chemin envoyé par le navigateur n'est donc jamais lu sur le disque, et la lecture comme la suppression sont ré-autorisées côté serveur.
Si vous découvrez une faille de sécurité, signalez-la par email plutôt que via le gestionnaire d'issues.