Aller au contenu

Extension Analyseur de journaux

Transformez l'éditeur en véritable atelier de journaux : analysez des fichiers de journaux structurés via des profils modifiables, naviguez par champs analysés et horodatages, fusionnez plusieurs sources sur une même chronologie, suivez une requête unique à travers les sources et analysez débits / percentiles / valeurs top-N — le tout sans charger le texte brut dans un onglet d'éditeur normal.

Où la trouver

L'extension ajoute trois entrées au menu Analyseur de journaux :

  • Analyseur de journaux ▸ Ouvrir en tant que journal… — ouvre un fichier de journal unique dans une fenêtre dédiée Vue du journal.
  • Analyseur de journaux ▸ Ouvrir les journaux fusionnés… — choisissez deux fichiers ou plus, donnez à chacun son profil et voyez-les entrelacés sur une même chronologie.
  • Analyseur de journaux ▸ Ouvrir le journal système… (Windows uniquement) — interrogez le journal d'événements Windows dans la même vue, avec des filtres poussés vers Get-WinEvent de PowerShell.

Une page Préférences ▸ Extensions ▸ Analyseur de journaux permet de régler les puces de niveau par défaut, le profil de repli pour les fichiers sans correspondance de glob, le seuil « avertir avant d'analyser les fichiers au-delà de N Mo », le mode de filtre par défaut et l'intervalle d'interrogation du suivi de fin — un seul réglage pour le minuteur de suivi de fichier et le flux du journal système (chaque interrogation du journal d'événements Windows lance un processus PowerShell, les sources lourdes préféreront donc plus lent).

Les gros fichiers s'analysent dans un fil d'arrière-plan avec un compteur d'enregistrements en direct, et les agrégations coûteuses (modèles de messages, anomalies) se calculent aussi en arrière-plan — la barre d'état affiche « Analyse des statistiques en arrière-plan… » et les panneaux se remplissent une fois prêts : la fenêtre reste réactive de bout en bout. Sur de très gros chargements, les statistiques agrègent les 150 000 enregistrements les plus récents et la chronologie échantillonne toute la plage.

Vue du journal (fichier unique)

Ouvrir un journal affiche la fenêtre dédiée Vue du journal. Elle reprend l'ergonomie des fenêtres à tableau de l'éditeur (comme la fenêtre de comparaison) et reste à l'écart de la barre d'onglets de l'éditeur.

Disposition

  • Barre d'outils — puces de niveau (TRACE…FATAL), mode de filtre + ligne de filtre, Erreur suivante / précédente (F8 / Shift+F8), Aller à l'heure (Ctrl+G).
  • Bande chronologique en haut — volume d'événements par intervalles, coloré par niveau. Tirez une plage pour filtrer par temps ; cliquez une barre pour amener le tableau au premier enregistrement à partir de cet intervalle.
  • Tableau au centre — Heure / Niveau / Source / Message, virtualisé pour défiler sans à-coups même avec des centaines de milliers d'enregistrements.
  • Volet de détail sous le tableau — l'entrée brute multiligne complète de la ligne sélectionnée.
  • Panneau de statistiques ancré à droite — compteurs par niveau, débit d'événements, sélecteur de percentiles (p50/p95/p99 sur tout champ numérique, bytes par défaut), répartition des classes de statut HTTP (1xx…5xx, masquée sans champ status) et tableau top-N sur tout champ (url par défaut, plafonné à 25 lignes).

Le tableau des enregistrements et le volet de détail utilisent la police de l'éditeur définie dans Préférences ▸ Général — la même fonte et la même taille qu'un onglet d'édition normal, si bien que les horodatages et les niveaux s'alignent colonne par colonne. Modifier ce réglage s'applique aux vues de journal déjà ouvertes, sans avoir à les rouvrir. Il en va de même pour la vue fusionnée, ses volets côte à côte et le diagramme de séquence. La barre d'outils, la ligne de filtre et le panneau de statistiques conservent la police de l'interface : ce sont des éléments d'habillage, pas du contenu de journal.

Modes de filtre

La ligne de filtre accepte cinq types d'expressions ; choisissez le mode dans la liste à sa gauche :

Mode Ce qu'il fait correspondre
Simple Sous-chaîne insensible à la casse sur la ligne brute.
Mots Jetons séparés par des espaces ; chaque jeton doit apparaître quelque part dans la ligne, dans n'importe quel ordre. phpinfo GET correspond à une ligne contenant phpinfo et GET.
Jokers Glob * et ? sur la ligne brute, insensible à la casse.
Regex Motif QRegularExpression, insensible à la casse par défaut.
Requête Grammaire structurée avec prédicats de champ, de niveau et de temps plus AND/OR/NOT et parenthèses.

Exemples du mode Requête :

level>=WARN
status:500 AND method:POST
message~/timeout|refused/ AND @time in [09:00..09:05]
NOT (source:nginx OR source:apache)
level>=ERROR OR (status:5\d\d AND method:POST)

La ligne de filtre temporise la frappe de 200 ms pour ne pas refiltrer le tableau à chaque touche ; Entrée ou la perte de focus applique immédiatement, vider la ligne aussi. Quand une expression Jokers / Regex / Requête ne compile pas, la ligne devient rouge et l'infobulle montre le diagnostic — le proxy conserve à l'écran le dernier filtre valide, le tableau ne se vide donc pas pendant la frappe.

  • F8 / Shift+F8 — enregistrement d'erreur ou fatal suivant / précédent.
  • Ctrl+G — aller à une heure précise (UTC, popup calendrier).
  • Cliquer une barre de la chronologie saute au premier enregistrement de l'intervalle.

Ces trois raccourcis sont réassignables dans le mappage des raccourcis (catégorie Log Analyzer) ; les Vues du journal ouvertes appliquent la réassignation immédiatement et les infobulles de la barre d'outils montrent le raccourci courant.

Analyse en direct + annulation

Les gros fichiers montrent des enregistrements en quelques dizaines de millisecondes ; l'analyse continue en arrière-plan et le tableau grandit au fil des arrivées. Filtrage, défilement et F8 fonctionnent pendant que l'analyse tourne encore. Fermer la fenêtre arrête promptement le worker.

Vue des journaux fusionnés

Analyseur de journaux ▸ Ouvrir les journaux fusionnés… permet d'enquêter sur un problème réparti sur plusieurs sources — journal client plus journal serveur, journal applicatif plus journal système, accès web plus erreurs, etc.

Le choix de profil par fichier

Après avoir choisi deux fichiers ou plus, un petit dialogue montre une ligne par fichier avec une liste de profils par ligne. La liste est présélectionnée en faisant correspondre le nom du fichier aux globs de chaque profil (insensible à la casse). Pour un déploiement nginx typique, access.log choisit nginx — access log (default combined) et error.log choisit nginx — error log. Remplacez n'importe quelle ligne à la main avant OK.

Disposition

  • Barre d'outils — puces de niveau, ligne de filtre avec liste de modes, contrôles de trace (liste + Suivre / Effacer), bascule Diagramme de séquence, bascule Côte à côte.
  • Bande chronologique en haut — histogramme empilé par source avec une voie par source : les rafales corrélées se voient à l'œil.
  • Bannière de trace au-dessus du tableau — bande ambre visible seulement quand un filtre de trace est actif : Suivi de <field> = <value> — N lignes dans toutes les sources.
  • Zone principale empilée — trois pages basculables depuis la barre d'outils :
    • Tableau (par défaut) : une ligne par enregistrement fusionné avec les colonnes Heure / Src / Niveau / Logger / Message ; la couleur du texte de la colonne Src est la couleur de voie de la source, on repère donc la source d'un coup d'œil.
    • Diagramme de séquence — voir Suivre une trace.
    • Volets côte à côte — voir Côte à côte.
  • Volet de détail sous le tableau.

Des filtres qui se composent

Dans la vue fusionnée, la chaîne de filtres s'exécute dans cet ordre, chacun se composant avec les autres :

  1. Visibilité des sources — une case dans la marge gauche de la frise, une par piste, à côté du nom et de la couleur de la source. Une piste décochée conserve sa ligne, estompée : il le faut, puisque cette case est le seul moyen de revenir. Un clic droit sur la marge propose Afficher uniquement cette source / Afficher toutes les sources.
  2. Puces de niveau — TRACE…FATAL.
  3. Suivi de trace — voir plus bas.
  4. Filtre textuel — Simple / Mots / Jokers / Regex / Requête (mêmes modes et même comportement que la vue à fichier unique, appliqués au flux fusionné).

Vous pouvez donc, par exemple, exécuter level>=ERROR AND status:500 sur les journaux access et error de nginx en une seule expression, et suivre un client unique à travers les deux — le filtre de trace resserre l'ensemble sans casser les filtres de niveau / source / texte.

Suivre une trace

  1. Choisissez une clé de corrélation dans la liste Trace : de la barre d'outils. Elle est amorcée avec l'ensemble conventionnel (trace_id / request_id / session_id / correlation_id / span_id / xRequestId) et tout nom de champ distinct réellement présent dans les enregistrements chargés. Tapez un nom personnalisé si besoin.
  2. Sélectionnez une ligne du tableau.
  3. Cliquez Suivre la trace — ou faites un clic droit sur la ligne et choisissez Suivre la trace : \<field>=\<value> pour toute clé conventionnelle que porte l'enregistrement (un raccourci qui évite l'étape de la liste).

Le tableau se filtre immédiatement sur les seuls enregistrements partageant la valeur de cette clé à travers toutes les sources. Cliquez Effacer la trace pour retirer le filtre.

Diagramme de séquence

Quand un filtre de trace est actif et qu'exactement 2 à 4 sources sont visibles, la bascule Diagramme de séquence devient disponible. Elle commute la zone principale en diagramme à voies fixes :

  • Chaque source visible est une voie verticale étiquetée en haut d'une pastille colorée.
  • Une ligne par enregistrement, le temps coulant de haut en bas. L'horodatage réel est à gauche pour ne pas perdre en précision ; les lignes sont par rang (hauteur fixe) plutôt que proportionnelles au temps, car une vraie trace a des rafales et de longues pauses — un axe proportionnel gaspillerait l'essentiel de l'écran sur les pauses.
  • Un point coloré sur la voie de la source propriétaire, plus une flèche grise discrète entre enregistrements consécutifs sur des voies différentes — on voit littéralement la trace rebondir entre systèmes.
  • Puce de niveau et texte du message à droite.

Cliquez une ligne du diagramme pour faire défiler le tableau sous-jacent jusqu'à cet enregistrement. Désactivez la bascule pour revenir au tableau.

Au-delà de 4 sources, le diagramme est désactivé et la vue tableau demeure.

Volets côte à côte

Quand exactement deux sources sont visibles, la bascule Côte à côte devient disponible. Elle scinde la zone principale en deux volets de tableau — une source chacun — aux positions de défilement liées par horodatage : faites défiler un volet et l'autre suit vers l'enregistrement le plus proche à partir de cette heure. La dérive entre horloges de serveurs apparaît naturellement comme un écartement des volets.

Les bascules Diagramme de séquence et Côte à côte s'excluent mutuellement (activer l'une désactive l'autre) ; toutes deux reviennent à la vue tableau quand le nombre de sources actives sort de leur plage prise en charge.

Un jeu de rotation forme une seule piste

Choisir trois fichiers d'un même jeu de rotation revient à choisir un seul journal : ils sont donc chargés comme une seule piste. Le sélecteur affiche une ligne par piste, ses segments listés en dessous du plus ancien au plus récent, et la piste porte le nom de son fichier le plus récent avec le nombre des plus anciens — MxAPILog.txt (+2).

Un clic droit sur une piste dans la frise propose Afficher chaque fichier en rotation séparément puis, une fois séparée, Fusionner les fichiers en rotation en une seule piste. La séparation est un redécoupage de ce qui est déjà en mémoire — rien n'est relu — mais elle change le sens d'une ligne, si bien que le tableau perd sa sélection.

Les sources doivent indiquer des temps comparables

Une fusion place sur un même axe les enregistrements de plusieurs sources, ce qui n'a de sens que si toutes peuvent indiquer autant de date. Un syslog sans année ne peut être situé face à un journal daté sans inventer l'année, et un journal de compilation sans horodatage ne peut être situé du tout. Le mélange est refusé d'emblée, avec un message indiquant quelles sources relèvent de quel groupe. Fusionnez des sources de même nature, ou ouvrez-les séparément.

Restauration

Une vue fusionnée revient avec la session. Ce qui est enregistré, c'est le profil choisi pour chaque piste et les fichiers auxquels cette piste s'est résolue ; les enregistrements sont relus en arrière-plan, de sorte que l'onglet apparaît aussitôt et se remplit ensuite. Les fichiers disparus et les profils supprimés sont ignorés et consignés dans le journal, plutôt que transformés en question au lancement.

Journaux système natifs (Windows)

Analyseur de journaux ▸ Ouvrir le journal système… interroge le journal d'événements Windows sans fichier sur disque. Le dialogue demande un canal (Application / System / Security / un nom personnalisé), un niveau minimal facultatif et un plafond d'enregistrements. L'extension appelle Get-WinEvent | ConvertTo-Json -Compress de PowerShell avec le filtre poussé, puis analyse la sortie NDJSON via le profil livré windows-event-log.

L'action n'est enregistrée que si l'hôte dispose vraiment d'une source de journal d'événements Windows opérationnelle — elle est réellement absente sous Linux et macOS, pas grisée.

Les sources du journal unifié macOS et de journald Linux sont prévues et se brancheront derrière la même interface interne, sans changement d'interface quand elles arriveront.

Profils

Le moteur n'a aucun analyseur câblé en dur. Chaque format pris en charge — Apache, nginx, syslog, JSON Lines, logfmt, CSV, journal d'événements Windows — est un fichier JSON LogProfile livré dans le dossier log-profiles/ de l'application. Les profils utilisateur vivent dans le dossier log-profiles/ du répertoire de configuration utilisateur et remplacent les profils livrés par id.

Chaque profil décrit :

  • le modèle de ligne — regex, json, logfmt, csv ou delimited ;
  • l'horodatage — quel champ, les formats de style strftime acceptés, le fuseau source, les unités d'époque ;
  • le niveau — quel champ plus une correspondance des jetons bruts vers l'énumération canonique Trace / Debug / Info / Warn / Error / Fatal ;
  • la continuation — comment les lignes suivantes se collent à l'enregistrement courant (une pile Java devient une entrée, pas 30) ;
  • les champs dérivés — des champs supplémentaires calculés par un sous-motif sur un champ existant. Les profils apache + nginx livrés s'en servent pour exposer un champ uniforme client_ip, afin que Follow trace de la vue fusionnée corrèle les événements access et error du même client à travers les deux sources ;
  • la rotation — quels fichiers forment un seul journal logique, et dans quel ordre. Voir Rotation : décrire un jeu de fichiers.

Vous n'avez pas à écrire ces fichiers à la main : l'éditeur correspondant — avec attrapeur de champs, alias de style grok et testeur d'horodatage en direct — est décrit sous Modifier les profils.

Les heures sont affichées avec la précision qu'indique le journal

Tous les journaux n'indiquent pas une date complète. Le syslog RFC 3164 donne un mois, un jour et une heure mais pas d'année ; certains journaux embarqués ou internes ne donnent qu'une heure ; les sorties de compilation n'en donnent aucune.

La colonne Heure affiche exactement ce que disait la ligne — 13:36:55, Oct 10 14:32:52, ou un horodatage complet suivi de UTC — et ne comble jamais un manque par une supposition. Il en va de même pour l'export TSV et pour l'aperçu de l'éditeur de profils, afin qu'une année inventée ne puisse pas quitter l'application et passer ensuite pour authentique.

Le tri, la frise et les statistiques continuent de fonctionner à l'intérieur d'un tel fichier : les parties manquantes sont ancrées en interne pour que les enregistrements restent comparables entre eux. Elles n'apparaissent simplement jamais.

Modifier les profils

Analyseur de journaux ▸ Modifier le profil… liste chaque profil avec une étiquette Intégré ou Personnalisé. Sélectionner un profil le charge.

Les profils intégrés sont en lecture seule, comme les thèmes intégrés : le formulaire est affiché mais désactivé, et Cloner est la façon d'en modifier un. Un clone reçoit un identifiant libre, afin qu'une copie ne masque jamais discrètement le profil dont elle provient. Nouveau part de zéro, Supprimer retire l'un des vôtres, et quitter un travail non enregistré demande confirmation.

Lorsqu'un profil importé porte le même identifiant qu'un profil intégré, il est enregistré sous un identifiant libre au lieu de le remplacer — et l'éditeur indique lequel.

Rotation : décrire un jeu de fichiers

Un journal en rotation est un flux découpé en plusieurs fichiers. Un profil indique quels fichiers vont ensemble au moyen de deux noms — rien de plus n'est nécessaire, et comme il n'y a qu'une description, rien ne peut se contredire.

Champ Signification
liveName Le fichier en cours d'écriture.
rotatedName La forme que prennent les fichiers plus anciens.
indexOrder Quelle extrémité de la numérotation est la plus récente.
orderBy D'où vient l'ordre. Presque toujours name.

Marqueurs

Les deux noms les acceptent. En dehors d'eux, chaque caractère est littéral — . est un point, pas « n'importe quel caractère », et * est un astérisque, pas un joker.

Marqueur Signifie
%LIVE% Le fichier ouvert. À utiliser quand le profil ne peut pas connaître le nom à l'avance.
%N Le numéro de rotation. Lu comme un nombre, si bien que _10 se place après _9 et non entre _1 et _2.
%Y %y Année, à quatre ou deux chiffres. Les années à deux chiffres utilisent le pivot habituel : 69–99 pour 19xx, 00–68 pour 20xx.
%m %b %B Mois en chiffres, en abrégé (Jul) ou en toutes lettres (July).
%d %j Jour du mois, ou jour de l'année.
%H %M %S Heure, minute, seconde — pour les schémas qui tournent plus d'une fois par jour.
%% Un signe pourcentage littéral.

Ce sont les mêmes champs strftime que le profil emploie dans ses formats d'horodatage : il n'y a pas de second jeu à apprendre.

Une extension de compression (.gz, .zip, .bz2, .xz) est gérée automatiquement et ne doit figurer dans aucun des deux noms : tous les schémas l'ajoutent en dernier, après ce que décrit le motif.

Les trois états de liveName

Valeur Quand
%LIVE% Un profil générique qui ne peut pas connaître le nom — le jeu est ancré au fichier ouvert.
Un nom littéral, p. ex. access.log Le profil est écrit pour une application dont le fichier actif porte toujours ce nom.
Vide Il n'y a pas de fichier actif sans numéro : chaque fichier est numéroté ou daté. C'est le cas d'IIS et de java.util.logging.

Exemples

Schéma liveName rotatedName
logrotate %LIVE% %LIVE%.%N
logrotate avec dateext %LIVE% %LIVE%-%Y%m%d
Apache / nginx access.log access.log.%N
IIS (vide) u_ex%y%m%d.log
log4j2 / logback, rotation par défaut %LIVE% app-%Y-%m-%d-%N.log
Rotation horaire %LIVE% app-%Y-%m-%d-%H.log
java.util.logging (vide) java%N.log

Comment l'ordre est déterminé

Avec orderBy: name — la valeur par défaut — la date du nom décide en premier, le numéro départage à l'intérieur d'une même date, et un fichier sans numéro est le fichier actif, donc le plus récent. indexOrder indique le sens des numéros : higher-is-older pour logrotate et spdlog, higher-is-newer pour Serilog, Boost.Log et tout ce qui compte vers le haut au fil du temps. Le nom seul ne permet pas de les distinguer : c'est donc au profil de le dire.

Les autres valeurs d'orderBy servent aux jeux dont les numéros ne sont pas fiables. La rotation cyclique réutilise sans cesse les mêmes quelques numéros : le numéro est un emplacement, pas un âge. first-record-time lit alors le premier horodatage de chaque fichier, et mtime se rabat sur le système de fichiers.

Si name est choisi et que les noms ne portent finalement ni date ni numéro, l'ordre retombe sur le premier enregistrement, puis sur mtime, puis sur le nom seul — et la barre d'état indique lequel, car mtime est réécrit par une copie, une décompression, une restauration de sauvegarde ou un changement de branche.

Une date dans un nom de fichier ne devient jamais l'horodatage d'un enregistrement

Les dates lues dans les noms de fichiers ne servent qu'à mettre les segments dans l'ordre. Les enregistrements tirent toujours leur horodatage de la ligne dont ils ont été analysés. Un fichier nommé access.log-20260730 contient toujours des enregistrements aux heures qu'indiquent ses propres lignes.

Motifs refusés

Un motif comportant deux %N, ou un %N accolé à un champ de date, est refusé au chargement du profil et la rotation y est désactivée, la raison figurant dans les diagnostics. app_%N%Y%m%d.log face à app_1220260730.log se lit de plusieurs façons, et en choisir une en silence désordonnerait le jeu sans que rien à l'écran ne l'explique. Placez n'importe quel caractère littéral entre les deux — tous les schémas réels le font déjà.

L'éditeur de profils valide les deux noms à la saisie, si bien qu'un motif refusé se voit là plutôt qu'à l'ouverture.

Séparer par exécution de l'application

Une exécution est une vie de l'application, du démarrage à l'arrêt, et ce n'est pas la même chose qu'un fichier : la rotation par taille découpe une exécution sur plusieurs fichiers, et un journal qui ne tourne qu'à la taille peut contenir plusieurs exécutions dans un seul fichier.

Si le journal écrit une ligne au démarrage — Volluto logging system started…, Begin file log, une bannière de framework — indiquez une expression régulière qui lui correspond dans le champ runStartMarker du profil. Un clic droit sur une piste dans la frise propose alors Séparer par exécution de l'application, et chaque exécution devient sa propre piste. L'entrée n'apparaît que si les enregistrements contiennent réellement plus d'une exécution.

Sans marqueur, les limites ne peuvent qu'être devinées à partir des écarts de temps, et cette supposition est désactivée par défaut, à dessein. Une exécution est une notion propre aux journaux applicatifs ; nginx, apache, syslog et les journaux de conteneurs sont des services continus sans aucune exécution, et une nuit calme serait autrement lue comme des centaines de redémarrages. Là où la supposition est utilisée, elle s'adapte au rythme du journal lui-même et est entièrement écartée si elle produit des exécutions trop courtes pour être réelles.

Un temps qui recule à l'intérieur d'une source est toujours traité comme une limite et toujours signalé — cela signifie soit un redémarrage, soit des segments mis dans le mauvais ordre, et les deux méritent d'être connus.

Thèmes

Les couleurs par niveau viennent du thème — l'extension enregistre une catégorie de palette par niveau canonique, l'Éditeur de thèmes les expose, et tout thème peut les remplacer. Changer de thème met à jour la colonne de niveau, la bande chronologique, le panneau de statistiques et le diagramme de séquence d'un même mouvement.

Voir aussi

  • Comparaison / diff — la fenêtre de comparaison dont les fenêtres de l'Analyseur de journaux s'inspirent.
  • Journalisation & diagnostics — le fichier journal propre de l'éditeur (distinct de la vue de l'Analyseur sur des formats de journaux arbitraires).