# Console

> Le flux de diagnostic en direct du programme en cours : 500 entrées en mémoire, cherchées et filtrées par niveau, domaine et composant, avec une capture détaillée et une trousse de soutien technique pour le dépannage.

L'onglet Console technique de [Événements](events) (`/events?view=console`) est le flux de diagnostic de tout
le programme : chaque sous-système (l'application, le serveur OPC UA embarqué, les pilotes, Logic,
Process, les tableaux de bord, l'accès agent et les licences) écrit dans un seul flux, et Console en
montre les 500 entrées les plus récentes, en direct. C'est le dernier onglet parce que c'est le
détail technique qui se lit en dernier, après les chronologies typées. Le voir demande **Voir les
événements**; exporter des lignes ou créer une trousse de soutien technique demande
**Exporter/importer les historiques**; démarrer ou arrêter une capture détaillée demande
**Modifier les paramètres**.

## Le flux et son tampon {#the-feed-and-its-buffer}

Console est une projection du flux de diagnostic unique du processus, gardée en mémoire : les 500
entrées les plus récentes, partagées par toutes les surfaces qui le montrent (la fenêtre propre à la
station, chaque navigateur distant, chaque onglet). Les entrées plus anciennes sortent à mesure que
de nouvelles arrivent; rien de cet onglet ne survit à un redémarrage. Le même flux est écrit dans un
fichier glissant quotidien, `logs\ganter-lab-<date>.log` dans le dossier de données de la station
(30 jours conservés, 50 MB par fichier), et c'est ce qu'une trousse de soutien technique recueille.

Chaque entrée est assainie avant d'atteindre Console ou le fichier : les mots de passe, les jetons,
les clés et les identifiants contenus dans une URL sont remplacés par « [REDACTED] », les charges
utiles de protocole (octets bruts, documents JSON ou XML) par « [PROTOCOL PAYLOAD OMITTED] », un
message est coupé à 16 KB et une exception à 64 KB avec « …[TRUNCATED] ». Seules les entrées de
niveau Information et au-dessus entrent dans le flux; le détail verbeux, et les entrées qu'un
producteur marque comme détail de diagnostic (bavardage de protocole brut et répétitif), n'atteignent
qu'un fichier de capture détaillée. Les échecs de communication qui se répètent sont regroupés par
leur producteur en une ligne de premier échec, des résumés périodiques et une ligne de reprise, pour
qu'un équipement en panne n'inonde pas la liste.

## Une entrée {#an-entry}

Chaque ligne montre l'heure du jour, un point pour le niveau (neutre pour Information, prudence pour
Avertissement, critique pour Erreur), « Domaine · Composant » et le message. Le bouton **Copier la
ligne** au bord droit d'une ligne copie « horodatage complet [Gravité] Domaine · Composant message »
et le journal des actions répond « Ligne copiée dans le presse-papiers. » (ou « Le presse-papiers a
refusé la copie. » sur un navigateur qui retient le presse-papiers). Cliquer sur la ligne la
sélectionne et ouvre le volet de détail.

## Recherche {#search}

Le champ « Rechercher dans les messages et tout le contexte disponible » filtre à mesure que vous
tapez, sans délai. Une ligne correspond quand le texte est contenu (sans distinction de casse) dans
l'un de ceux-ci : le message, le domaine, le composant, l'enregistreur, l'équipement, le tag Connector,
l'opération, le client OPC UA, le numéro de session, l'unité, la procédure, l'ID d'essai ou le texte de
détail (une exception et sa pile d'appels).

## Les pastilles de niveau {#the-level-chips}

Trois pastilles, **Information**, **Avertissement** et **Erreur**, chacune un interrupteur avec un point
dans la teinte du niveau et un compte en direct. Une pastille activée montre son niveau; cliquez
dessus pour cacher ce niveau. Le compte est le nombre d'entrées que la pastille révélerait sous la
recherche, le domaine et le composant en cours : il respecte ces trois filtres et ignore les
interrupteurs de niveau eux-mêmes, donc un niveau caché annonce tout de même ce qu'il contient. Les
trois commencent activées.

Il n'y a pas de pastille Debug : les entrées sous Information n'entrent jamais dans le flux, donc une
pastille pour elles n'afficherait jamais que 0 et ne cacherait rien. Le détail verbeux se trouve
plutôt dans un fichier de capture détaillée.

## Les listes Domaine et Composant {#the-area-and-component-lists}

| Liste | Valeurs | Ce qu'elle fait |
| --- | --- | --- |
| Domaine | **Tous les domaines** (par défaut), puis un par sous-système : **App**, **Server**, **Connector**, **Logic**, **Process**, **Dashboard**, **Agent**, **Licensing** | Ne garde que les entrées d'un sous-système. |
| Composant | **Tous les composants** (par défaut), puis chaque composant présent dans le tampon pour le domaine sélectionné, par ordre alphabétique | Ne garde que les entrées d'un producteur concret à l'intérieur du domaine (un pilote, un service, le SDK OPC UA). |

| Domaine | Ce qui y écrit |
| --- | --- |
| App | Le cycle de vie de l'application : l'hôte de bureau, la journalisation, la gestion des incidents et des mises à jour, les échecs propres au journal d'événements, et tout ce qui n'a nommé aucun autre domaine. |
| Server | Le serveur OPC UA embarqué et son SDK. |
| Connector | La communication avec les équipements : le connecteur, les pilotes, les lectures et les écritures de tags. |
| Logic | Les variables, les actions, les déclencheurs, les alarmes et le canal d'écriture. |
| Process | Les modèles, les recettes, les évaluations, les occurrences, le moniteur du verrouillage et le cycle de vie d'un essai. |
| Dashboard | Les commandes pressées sur les tableaux de bord, et l'hôte web embarqué qui les sert. |
| Agent | Ce qu'un agent d'intelligence artificielle a fait par MCP. |
| Licensing | La licence de la station et le limiteur du runtime sans licence. |

Le composant que vous avez choisi demeure dans la liste même après que chaque entrée qui le portait
est sortie du tampon, pour qu'un filtre réglé sur un seul pilote ne soit pas silencieusement élargi à
tous les composants; une liste vide est alors la réponse honnête. Changer de domaine reconstruit la
liste des composants de ce domaine.

## Suivre la fin {#following-the-tail}

Avec **Suivre la fin (défilement automatique)** activé (le réglage par défaut), la liste colle à
l'entrée la plus récente à mesure que le flux grandit. Défiler vers le haut le désactive, ce qui
permet de lire quelque chose pendant que les entrées continuent d'arriver; revenir à moins de
24 pixels du bas le réactive. Pendant qu'il est désactivé, une pastille « N nouvelles entrées » (ou
« 1 nouvelle entrée ») compte les arrivées qui correspondent aux filtres en cours; cliquez dessus,
ou sur le bouton de la barre de commandes, pour revenir à la fin. Passer à un autre onglet et
revenir conserve l'état du suivi, et saute à la fin s'il était activé.

## La barre de commandes {#the-toolbar}

| Commande | Ce qu'elle fait | Grisée quand | Non dessinée quand |
| --- | --- | --- | --- |
| Démarrer la capture / Arrêter la capture | Démarre une capture de diagnostic détaillée pour un maximum de 15 minutes, ou arrête celle qui est en cours (voir plus bas). | Pendant que le changement est appliqué | Le rôle n'a pas Modifier les paramètres |
| Ouvrir dans une fenêtre | Ouvre la page Événements dans un nouvel onglet ou une nouvelle fenêtre du navigateur, aussi bien dans la fenêtre propre à la station que dans un navigateur distant, pour garder le flux sur un second écran. La nouvelle fenêtre s'ouvre sur l'onglet Console, celui où se trouve le bouton. Un navigateur qui bloque les fenêtres surgissantes n'ouvre rien et le journal des actions le dit : « Le navigateur n'a pas voulu ouvrir une seconde fenêtre. Autorisez les fenêtres surgissantes pour cette station et réessayez. » | | |
| Retour à la ligne | Renvoie les messages longs sur plusieurs lignes au lieu de les tronquer. | | |
| Suivre la fin (défilement automatique) | Active le suivi (en sautant à la fin et en effaçant le compte de nouvelles entrées) ou le désactive. | | |
| Vider la vue | Vide le flux en mémoire sur toutes les surfaces à la fois : la fenêtre de la station, chaque navigateur distant et chaque onglet voient la même liste vide. Le journal des actions répond « Vue de la console vidée pour toute la station. » Les fichiers journaux glissants, les fichiers de capture et le journal d'événements ne sont pas touchés. | Le runtime est arrêté : le bouton est grisé, et son infobulle dit que la station n'accepte aucune modification pour l'instant | Le rôle n'a pas Modifier les paramètres |
| Exporter | Ouvre le menu : **Exporter en CSV…**, **Exporter en JSON…** et, après un séparateur, **Créer une trousse de soutien technique…**. | Créer une trousse de soutien technique est grisé pendant qu'une trousse est en construction | Le rôle n'a pas Exporter/importer les historiques |

## Capture détaillée {#detailed-capture}

**Démarrer la capture** hausse tout le processus à la journalisation verbeuse pour un maximum de
quinze minutes et écrit tout, détail verbeux et bavardage de protocole compris, dans un fichier de
capture qui lui est propre :
`logs\diagnostic-captures\ganter-temporary-diagnostic-<stamp>-<id>.log` dans le dossier de données de
la station (une session bascule à 25 MB en gardant deux fichiers; les dix sessions les plus récentes
sont conservées). Le flux de 500 entrées et le fichier glissant normal demeurent exactement tels
qu'ils étaient : rien de plus ne les atteint.

Le bouton indique alors **Arrêter la capture**; son infobulle dit « Arrêter la capture de diagnostic
détaillée avant son terme. Démarrée hh:mm:ss. » La capture s'arrête d'elle-même quand le compte à rebours atteint
zéro, quand vous pressez le bouton, ou quand l'application se ferme. Les deux extrémités sont
annoncées dans le journal des actions (« Capture détaillée démarrée pour un maximum de 15 minutes. »,
« Capture détaillée arrêtée. ») et laissent des lignes de Console sous App · Capture de diagnostic.

La capture est un interrupteur qui vaut pour toute la station : chaque circuit voit le même compte à
rebours, et elle survit à la fenêtre qui l'a pressé. C'est pourquoi elle demande **Modifier les
paramètres** : un rôle qui ne l'a pas ne se voit pas dessiner le bouton, et un appui qui atteindrait
tout de même le traitement répond « Démarrer ou arrêter la capture détaillée demande la permission
Modifier les paramètres. » Ce que la capture fait ne dépend d'aucune permission : pendant qu'elle
enregistre, un affichage à côté du bouton porte un point d'enregistrement, « Capture détaillée
active » et le temps qu'il lui reste (mm:ss, à partir de 15:00), et tous les rôles le lisent. Quand
rien n'enregistre, ce même affichage est laissé au lecteur d'écran, qui indique « Capture détaillée
inactive ».

## Créer une trousse de soutien technique {#create-support-package}

Le dernier élément du menu Exporter construit un zip à remettre au soutien technique et le télécharge
par le navigateur; le journal des actions répond « Trousse de soutien technique créée : » suivi du
nom du fichier (`ganter-support-<stamp>-<id>.zip`), ou « Échec de la trousse de soutien technique : »
suivi de la raison. Elle demande **Exporter/importer les historiques** comme tout export. La trousse
contient :

| Entrée | Contenu |
| --- | --- |
| `recent-console.json` | Les entrées du flux en mémoire sous forme d'enregistrements structurés (chaque champ de chaque entrée, pas la vue filtrée). |
| `logs/ganter-lab-*.log` | Les fichiers journaux glissants normaux. |
| `diagnostic-captures/ganter-temporary-diagnostic-*.log` | Les fichiers de capture détaillée. |
| `manifest.json` | Quand elle a été produite, l'état de la capture (active, démarrée, fin, arrêtée, nom du fichier), combien d'entrées du flux ont été incluses, les limites, la liste des fichiers inclus avec leur taille, et chaque omission avec sa raison. |

Les fichiers sont pris du plus récent au plus ancien à l'intérieur d'un budget : au plus 8 fichiers,
au plus 24 MB par fichier et 96 MB en tout; un fichier plus gros que sa part est inclus par sa fin
seulement (ses octets les plus récents) et le manifeste le dit. Le zip est construit dans le dossier
temporaire du système et supprimé une fois le téléchargement servi.

## Le volet de détail {#the-detail-panel}

Sélectionner une entrée ouvre le volet avec le badge de gravité, « Domaine · Composant » et une croix
de fermeture, puis :

| Section | Champ | Contenu |
| --- | --- | --- |
| En-tête | Horodatage | Date et heure complètes avec les millisecondes. |
| En-tête | Message | Le message d'une ligne. |
| CONTEXTE | Domaine | Le sous-système. |
| CONTEXTE | Composant | Le producteur concret. |
| CONTEXTE | Enregistreur | La catégorie de journalisation derrière l'entrée, montrée quand elle est connue. |
| CONTEXTE | Niveau | Le mot de la pastille du niveau : Information, Avertissement ou Erreur. Debug n'apparaît jamais, puisqu'aucune entrée sous Information n'entre dans le flux. |
| CONTEXTE | Équipement, Tag Connector, Opération, Client OPC UA, Numéro de session, Unité, Procédure, Essai | Chacun montré seulement quand l'entrée le porte : l'équipement et le tag auxquels une ligne de Connector se rapporte, l'opération diagnostiquée (une lecture, une écriture, une connexion), le client et la session OPC ou de protocole, et l'unité, la procédure et l'ID d'essai de Process. |
| DÉTAILS | | Le texte de l'exception et sa pile d'appels, quand l'entrée en portait une. |

**Copier l'entrée** au pied copie tout le volet en texte (la ligne d'en-tête, le message, une ligne
« Libellé : valeur » par champ de contexte, puis le bloc de détail) et répond « Entrée copiée dans le
presse-papiers. » La sélection est abandonnée si l'entrée sort du tampon, et effacée par Vider la
vue.

## Exporter {#export}

**Exporter en CSV…** et **Exporter en JSON…** écrivent les lignes actuellement visibles (la vue
filtrée) sous forme de téléchargement du navigateur nommé `app-logs-<yyyyMMdd-HHmmss>.csv` ou
`.json`; le journal des actions répond « N lignes exportées vers » suivi du nom du fichier. Les
deux portent les mêmes colonnes, dans cet ordre : `Timestamp` (intitulée « Timestamp (UTC-03:00) »
dans le CSV, la référence de temps déclarée une seule fois), `Severity`, `Area`, `Component`,
`Logger`, `Device`, `Tag`, `Operation`, `Client`, `Session`, `Unit`, `Procedure`, `RunId`, `Message`
et `Exception`. Le JSON est une enveloppe, `{ "TimeZone": "...", "Entries": [ ... ] }`. Une cellule
CSV qui commence par `=`, `+`, `-` ou `@` est préfixée d'une apostrophe pour qu'un tableur la lise
comme du texte.

## La ligne d'état {#the-status-line}

« N affichées · M dans le tampon », puis « · filtré » tant qu'une recherche, un domaine, un composant
ou un filtre de niveau est en vigueur; à droite, « 1 sélectionné » tant qu'une entrée est
sélectionnée et « Mise à jour hh:mm:ss », l'heure de l'entrée la plus récente du tampon, dès l'ouverture de la page. Quand rien ne
correspond, la liste indique « Aucune entrée ne correspond aux filtres actuels. Ajustez le niveau,
le domaine, le composant ou la recherche pour en voir davantage. »

## Ce que Console ne fait pas {#what-console-does-not-do}

- Ce n'est pas un registre : elle garde 500 entrées en mémoire, les perd au redémarrage, et Vider la
  vue la vide pour tout le monde. Le registre durable, ce sont les trois chronologies et, sur le
  disque, les fichiers journaux glissants.
- Elle ne montre rien sous Information, et jamais le détail des protocoles; c'est à cela que sert
  une capture détaillée.
- Vider la vue ne supprime aucun fichier ni aucune ligne du journal, est refusé tant que le runtime
  est arrêté, et n'est dessiné que pour un rôle qui peut modifier les paramètres, comme Exporter et
  Démarrer la capture à côté.
- La capture détaillée ne peut pas être allongée au-delà de quinze minutes; démarrez-en une autre.
- Exporter écrit ce qui est visible, jamais les fichiers du disque; la trousse de soutien technique
  est la façon dont les fichiers quittent la station.
- Un agent dont le domaine Logs est ouvert lit ce même flux par `logs_read`
  (voir [Outils](agent-tools)); il ne peut pas le vider.
