# Konsole

> Der laufende Diagnosestrom des ausgeführten Programms: 500 Einträge im Arbeitsspeicher, durchsucht und gefiltert nach Stufe, Bereich und Komponente, mit ausführlicher Aufzeichnung und Supportpaket zur Fehlersuche.

Die Registerkarte Konsole von [Ereignisse](events) (`/events?view=console`) ist der Diagnosestrom
des ganzen Programms: Jedes Teilsystem (die Anwendung, der eingebettete OPC UA Server, die Treiber,
Logic, Process, die Dashboards, der Agentenzugriff und die Lizenzierung) schreibt in einen Strom,
und die Konsole zeigt dessen jüngste 500 Einträge, live. Sie ist die letzte Registerkarte, weil sie
das technische Detail trägt, das zuletzt gelesen wird, nach den typisierten Verläufen. Sie zu sehen
setzt **Ereignisse anzeigen** voraus; Zeilen zu exportieren oder ein Supportpaket zu erstellen setzt
**Historien exportieren/importieren** voraus; eine ausführliche Aufzeichnung zu starten oder zu
beenden setzt **Einstellungen ändern** voraus.

## Der Strom und sein Puffer {#the-feed-and-its-buffer}

Die Konsole ist eine Projektion des einen Diagnoseflusses des Prozesses, im Arbeitsspeicher
gehalten: die neuesten 500 Einträge, geteilt von jeder Fläche, die ihn zeigt (dem Fenster der
Station selbst, jedem entfernten Browser, jeder Registerkarte). Ältere Einträge fallen heraus,
sobald neue eintreffen; nichts auf dieser Registerkarte übersteht einen Neustart. Derselbe Fluss
wird in eine täglich rollierende Datei geschrieben, `logs\ganter-lab-<date>.log` im Datenordner der
Station (30 Tage aufbewahrt, 50 MB je Datei), und genau diese sammelt ein Supportpaket ein.

Jeder Eintrag wird bereinigt, bevor er die Konsole oder die Datei erreicht: Kennwörter, Token,
Schlüssel und Anmeldedaten in URLs werden durch "[REDACTED]" ersetzt, Protokollnutzdaten (rohe
Bytes, JSON- oder XML-Dokumente) durch "[PROTOCOL PAYLOAD OMITTED]", eine Meldung wird bei 16 KB und
eine Ausnahme bei 64 KB mit "…[TRUNCATED]" abgeschnitten. Nur Einträge ab der Stufe Information
gelangen in den Strom; ausführliches Detail und Einträge, die ein Erzeuger als Diagnosedetail
kennzeichnet (rohes, sich wiederholendes Protokollgeplauder), erreichen allein eine Datei der
ausführlichen Aufzeichnung. Wiederkehrende Kommunikationsfehler werden von ihrem Erzeuger zu einer
Zeile für den ersten Fehler, regelmäßigen Zusammenfassungen und einer Zeile für die Erholung
zusammengefasst, damit ein gestörtes Gerät die Liste nicht überschwemmt.

## Ein Eintrag {#an-entry}

Jede Zeile zeigt die Tageszeit, einen Punkt für die Stufe (neutral für Information, warnend für Warnung,
kritisch für Fehler), "Bereich · Komponente" und die Meldung. Die Schaltfläche **Zeile kopieren** am
rechten Rand einer Zeile kopiert "vollständiger Zeitstempel [Schweregrad] Bereich · Komponente
Meldung", und das Aktionsprotokoll antwortet "Zeile in die Zwischenablage kopiert." (oder "Die
Zwischenablage hat das Kopieren abgelehnt." in einem Browser, der die Zwischenablage zurückhält).
Ein Klick auf die Zeile wählt sie aus und öffnet den Detailbereich.

## Suche {#search}

Das Feld "Meldungen und den gesamten verfügbaren Kontext durchsuchen" filtert schon während des
Tippens, ohne Verzögerung. Eine Zeile passt, wenn der Text (ohne Beachtung der Groß- und
Kleinschreibung) in einem der folgenden Felder enthalten ist: der Meldung, dem Bereich, der
Komponente, dem Logger, dem Gerät, dem Tag, dem Vorgang, dem Client, der Sitzung, der Einheit, dem
Ablauf, der Laufkennung oder dem Detailtext (einer Ausnahme und ihrer Stapelüberwachung).

## Die Chips der Stufen {#the-level-chips}

Drei Chips, **Information**, **Warnung** und **Fehler**, jeder ein Umschalter mit einem Punkt im Ton der
Stufe und einer laufenden Zählung. Ein eingeschalteter Chip zeigt seine Stufe; ein Klick blendet
diese Stufe aus. Die Zählung sagt, wie viele Einträge der Chip unter der aktuellen Suche und den
aktuellen Filtern für Bereich und Komponente offenlegen würde: Sie achtet auf diese drei Filter und
übergeht die Umschalter der Stufen selbst, eine ausgeblendete Stufe wirbt also weiterhin mit dem,
was sie hält. Alle drei beginnen eingeschaltet.

Es gibt keinen Chip für Debug: Einträge unterhalb von Information gelangen nie in den Strom, ein
Chip dafür könnte also immer nur 0 anzeigen und nichts ausblenden. Ausführliches Detail findet sich
stattdessen in einer Datei der ausführlichen Aufzeichnung.

## Die Listen Bereich und Komponente {#the-area-and-component-lists}

| Liste | Werte | Was sie tut |
| --- | --- | --- |
| Bereich | **Alle Bereiche** (Vorgabe), dann einer je Teilsystem: **App**, **Server**, **Connector**, **Logic**, **Process**, **Dashboard**, **Agent**, **Licensing** | Behält die Einträge eines Teilsystems. |
| Komponente | **Alle Komponenten** (Vorgabe), dann jede Komponente, die im Puffer für den gewählten Bereich vorkommt, alphabetisch sortiert | Behält die Einträge eines konkreten Erzeugers innerhalb des Bereichs (eines Treibers, eines Arbeiters, des OPC UA SDK). |

| Bereich | Was dort schreibt |
| --- | --- |
| App | Der Lebenszyklus der Anwendung: der Desktop-Host, die Protokollierung, die Behandlung von Abstürzen und Aktualisierungen, die eigenen Fehler des Ereignisjournals und alles, was keinen anderen Bereich genannt hat. |
| Server | Der eingebettete OPC UA Server und sein SDK. |
| Connector | Die Kommunikation mit den Geräten: der Connector, die Treiber, das Lesen und Schreiben von Tags. |
| Logic | Variablen, Aktionen, Auslöser, Alarme und der Schreibkanal für Schreibvorgänge. |
| Process | Modelle, Rezepte, Bewertungen, Ereigniseinträge, die Verriegelungsüberwachung und der Lebenszyklus eines Laufs. |
| Dashboard | Befehle, die auf Dashboards gedrückt wurden, und der eingebettete Webhost, der sie ausliefert. |
| Agent | Was ein KI-Agent über MCP getan hat. |
| Licensing | Die Lizenz der Station und die Begrenzung der unlizenzierten Runtime. |

Die von Ihnen gewählte Komponente bleibt in der Liste, auch nachdem jeder Eintrag mit ihr aus dem
Puffer gefallen ist, damit ein Filter, der einen Treiber beobachten soll, nicht still auf jede
Komponente geweitet wird; eine leere Liste ist dann die ehrliche Antwort. Ein Wechsel des Bereichs
baut die Liste der Komponenten für diesen Bereich neu auf.

## Dem Ende folgen {#following-the-tail}

Mit eingeschaltetem **Ende verfolgen (automatisch scrollen)** (der Vorgabe) klebt die Liste am
neuesten Eintrag, während der Strom wächst. Ein Bildlauf nach oben schaltet es aus, so dass Sie
etwas lesen können, während weiter Einträge eintreffen; ein Bildlauf zurück bis auf 24 Pixel an den
unteren Rand schaltet es wieder ein. Solange es aus ist, zählt eine Pille "N neue Einträge" (oder
"1 neuer Eintrag") die Ankünfte, die zu den aktuellen Filtern passen; ein Klick darauf oder auf die
Schaltfläche in der Befehlsleiste springt zurück ans Ende. Ein Wechsel auf eine andere
Registerkarte und zurück bewahrt den Zustand des Verfolgens und springt ans Ende, wenn es
eingeschaltet war.

## Die Befehlsleiste {#the-toolbar}

| Befehl | Was er tut | Ausgegraut, wenn | Nicht gezeichnet, wenn |
| --- | --- | --- | --- |
| Aufzeichnung starten / Aufzeichnung beenden | Startet eine ausführliche Diagnoseaufzeichnung für bis zu 15 Minuten oder beendet die laufende (siehe unten). | Während der Umschaltung | Der Rolle fehlt Einstellungen ändern |
| In einem Fenster öffnen | Öffnet die Seite Ereignisse in einer neuen Registerkarte oder einem neuen Fenster des Browsers, im Fenster der Station selbst ebenso wie in einem entfernten Browser, so dass der Strom auf einem zweiten Bildschirm stehen bleiben kann. Das neue Fenster öffnet auf der Registerkarte Konsole, also der, auf der die Schaltfläche sitzt. Ein Browser, der Pop-ups blockiert, öffnet nichts, und das Aktionsprotokoll sagt es: "Der Browser wollte kein zweites Fenster öffnen. Erlauben Sie Pop-ups für diese Station und versuchen Sie es erneut." | | |
| Zeilenumbruch | Bricht lange Meldungen auf mehrere Zeilen um, statt sie abzuschneiden. | | |
| Ende verfolgen (automatisch scrollen) | Schaltet das Verfolgen ein (springt ans Ende und löscht die Zählung neuer Einträge) oder aus. | | |
| Ansicht leeren | Leert den Strom im Arbeitsspeicher auf allen Flächen zugleich: das Fenster der Station, jeder entfernte Browser und jede Registerkarte sehen dieselbe leere Liste. Das Aktionsprotokoll antwortet "Die Konsolenansicht wurde für die ganze Station geleert." Die rollierenden Protokolldateien, die Dateien der Aufzeichnungen und das Ereignisjournal bleiben unberührt. | Die Runtime ist gestoppt: Die Schaltfläche ist ausgegraut, und ihr Tooltip sagt, dass die Station gerade keine Änderung annimmt | Der Rolle fehlt Einstellungen ändern |
| Exportieren | Öffnet das Menü: **Als CSV exportieren…**, **Als JSON exportieren…** und, nach einem Trenner, **Supportpaket erstellen…**. | Supportpaket erstellen ist ausgegraut, solange eines gebaut wird | Der Rolle fehlt Historien exportieren/importieren |

## Ausführliche Aufzeichnung {#detailed-capture}

**Aufzeichnung starten** hebt den ganzen Prozess für bis zu fünfzehn Minuten auf ausführliche
Protokollierung und schreibt alles, ausführliches Detail und Protokollgeplauder eingeschlossen, in
eine eigene Datei der Aufzeichnung:
`logs\diagnostic-captures\ganter-temporary-diagnostic-<stamp>-<id>.log` im Datenordner der Station
(eine Sitzung rolliert bei 25 MB und behält zwei Dateien; die zehn jüngsten Sitzungen werden
aufbewahrt). Der Strom mit 500 Einträgen und die gewöhnliche rollierende Datei bleiben genau so, wie
sie waren: Nichts Zusätzliches erreicht sie.

Die Schaltfläche lautet dann **Aufzeichnung beenden**; ihr Tooltip sagt "Die ausführliche
Diagnoseaufzeichnung vorzeitig beenden. Gestartet hh:mm:ss." Die Aufzeichnung endet von selbst,
wenn der Countdown null erreicht,
wenn Sie die Schaltfläche drücken oder wenn die Anwendung heruntergefahren wird. Beide Enden werden
im Aktionsprotokoll angesagt ("Ausführliche Aufzeichnung für bis zu 15 Minuten gestartet.",
"Ausführliche Aufzeichnung beendet.") und hinterlassen Konsolenzeilen unter App · Diagnostic
capture.

Die Aufzeichnung ist ein Schalter für die ganze Station: Jeder Kreis sieht denselben Countdown, und
sie überlebt das Fenster, das sie gedrückt hat. Darum setzt sie **Einstellungen ändern** voraus:
Einer Rolle ohne diese Berechtigung wird die Schaltfläche nicht gezeichnet, und ein Druck, der
dennoch die Verarbeitung erreicht, antwortet "Das Starten oder Beenden der ausführlichen
Aufzeichnung setzt die Berechtigung Einstellungen ändern voraus." Was die Aufzeichnung tut, steht unter
keiner Berechtigung: Während sie läuft, trägt eine Anzeige neben der Schaltfläche einen
Aufnahmepunkt, "Ausführliche Aufzeichnung läuft" und die verbleibende Zeit (mm:ss, ab 15:00), und
jede Rolle liest sie. Zeichnet nichts auf, bleibt dieselbe Anzeige dem Screenreader vorbehalten, der
"Ausführliche Aufzeichnung inaktiv" liest.

## Supportpaket erstellen {#create-support-package}

Der letzte Eintrag des Menüs Export baut eine ZIP-Datei, die dem Support übergeben wird, und lädt
sie über den Browser herunter; das Aktionsprotokoll antwortet "Supportpaket erstellt:" gefolgt vom
Dateinamen (`ganter-support-<stamp>-<id>.zip`) oder "Das Supportpaket ist fehlgeschlagen:" gefolgt vom
Grund. Es setzt wie jeder Export **Historien exportieren/importieren** voraus. Das Paket enthält:

| Eintrag | Inhalt |
| --- | --- |
| `recent-console.json` | Die Einträge des Stroms im Arbeitsspeicher als strukturierte Datensätze (jedes Feld jedes Eintrags, nicht die gefilterte Ansicht). |
| `logs/ganter-lab-*.log` | Die gewöhnlichen rollierenden Protokolldateien. |
| `diagnostic-captures/ganter-temporary-diagnostic-*.log` | Die Dateien der ausführlichen Aufzeichnungen. |
| `manifest.json` | Wann es erzeugt wurde, der Zustand der Aufzeichnung (aktiv, gestartet, endet, beendet, Dateiname), wie viele Einträge des Stroms aufgenommen wurden, die Grenzen, die Liste der aufgenommenen Dateien mit ihren Größen und jede Auslassung mit ihrem Grund. |

Die Dateien werden innerhalb eines Budgets von den neuesten her genommen: höchstens 8 Dateien,
höchstens 24 MB je Datei und 96 MB insgesamt; eine Datei, die größer ist als ihr Anteil, wird nur
mit ihrem Ende aufgenommen (ihren neuesten Bytes), und das Manifest sagt es. Die ZIP-Datei wird im
temporären Ordner des Systems gebaut und gelöscht, sobald der Download ausgeliefert ist.

## Der Detailbereich {#the-detail-panel}

Das Auswählen eines Eintrags öffnet den Bereich mit dem Abzeichen des Schweregrads, "Bereich ·
Komponente" und einem Kreuz zum Schließen, dann:

| Abschnitt | Feld | Inhalt |
| --- | --- | --- |
| Kopf | Zeitstempel | Vollständiges Datum mit Uhrzeit und Millisekunden. |
| Kopf | Meldung | Die einzeilige Meldung. |
| KONTEXT | Bereich | Das Teilsystem. |
| KONTEXT | Komponente | Der konkrete Erzeuger. |
| KONTEXT | Protokollquelle | Die Loggerkategorie hinter dem Eintrag, gezeigt, wenn sie bekannt ist. |
| KONTEXT | Stufe | Das Wort des Chips der Stufe: Information, Warnung oder Fehler. Debug erscheint nie, denn kein Eintrag unterhalb von Information gelangt in den Strom. |
| KONTEXT | Gerät, Tag, Vorgang, Client, Sitzung, Einheit, Ablauf, Lauf | Jedes nur gezeigt, wenn der Eintrag es trägt: das Gerät und das Tag, auf die sich eine Zeile des Connectors bezieht, der untersuchte Vorgang (ein Lesen, ein Schreiben, eine Verbindung), der OPC- oder Protokollclient und die Sitzung sowie Einheit, Ablauf und Laufkennung aus Process. |
| EINZELHEITEN | | Der Text der Ausnahme und ihre Stapelüberwachung, wenn der Eintrag eine trug. |

**Eintrag kopieren** am Fuß kopiert den ganzen Bereich als Text (die Kopfzeile, die Meldung, je eine
Zeile "Bezeichnung: Wert" pro Kontextfeld, dann den Detailblock) und antwortet "Eintrag in die
Zwischenablage kopiert." Die Auswahl entfällt, wenn der Eintrag aus dem Puffer fällt, und wird von
Ansicht leeren aufgehoben.

## Exportieren {#export}

**Als CSV exportieren…** und **Als JSON exportieren…** schreiben die gerade sichtbaren Zeilen (die
gefilterte Ansicht) als Browser-Download namens `app-logs-<yyyyMMdd-HHmmss>.csv` oder `.json`; das
Aktionsprotokoll antwortet "N Zeile(n) exportiert nach" gefolgt vom Dateinamen. Beide tragen
dieselben Spalten, in dieser Reihenfolge: `Timestamp` (in der CSV mit "Timestamp (UTC-03:00)"
überschrieben, der einmal erklärte Zeitbezug), `Severity`, `Area`, `Component`, `Logger`, `Device`,
`Tag`, `Operation`, `Client`, `Session`, `Unit`, `Procedure`, `RunId`, `Message` und `Exception`.
Die JSON ist ein Umschlag, `{ "TimeZone": "...", "Entries": [ ... ] }`. Einer CSV-Zelle, die mit
`=`, `+`, `-` oder `@` beginnt, wird ein Apostroph vorangestellt, damit eine Tabellenkalkulation sie
als Text liest.

## Die Statuszeile {#the-status-line}

"N angezeigt · M im Puffer", dann " · gefiltert", solange eine Suche oder ein Filter für Bereich,
Komponente oder Stufe wirkt; rechts "1 ausgewählt", solange ein Eintrag ausgewählt ist, und
"Aktualisiert hh:mm:ss", die Zeit des neuesten Eintrags im Puffer, schon ab dem Öffnen der Seite. Wenn nichts passt, lautet die
Liste "Kein Eintrag passt zu den aktuellen Filtern. Ändern Sie Stufe, Bereich, Komponente oder
Suche, um mehr zu sehen."

## Was die Konsole nicht tut {#what-console-does-not-do}

- Sie ist keine Aufzeichnung: Sie hält 500 Einträge im Arbeitsspeicher, verliert sie bei einem
  Neustart, und Ansicht leeren leert sie für alle. Die dauerhafte Aufzeichnung sind die drei
  Verläufe und, auf der Platte, die rollierenden Protokolldateien.
- Sie zeigt nichts unterhalb von Information und nie das Protokolldetail; dafür ist eine
  ausführliche Aufzeichnung da.
- Ansicht leeren löscht keine Datei und keine Journalzeile, wird abgewiesen, solange die Runtime
  gestoppt ist, und wird nur für eine Rolle gezeichnet, die Einstellungen ändern darf, wie Export
  und Aufzeichnung starten daneben.
- Die ausführliche Aufzeichnung lässt sich nicht über fünfzehn Minuten hinaus verlängern; starten
  Sie eine weitere.
- Der Export schreibt, was sichtbar ist, nie die Dateien auf der Platte; das Supportpaket ist der
  Weg, auf dem die Dateien die Station verlassen.
- Ein Agent mit geöffnetem Bereich Logs liest denselben Strom über `logs_read`
  (siehe [Werkzeuge](agent-tools)); leeren kann er ihn nicht.
