Protokollseite: die Logs der Hintergrundprozesse im Dashboard

Bisher kam man an die Ausgabe von solarManager.py, dem Runner und den
uebrigen Dauerprozessen nur per SSH heran. Die neue Seite unter
"Protokolle" zeigt sie: links die fuenf Dateien mit Groesse und Alter -
eine, die seit Tagen nicht gewachsen ist, faellt so auf, ohne dass man sie
oeffnet -, rechts die Zeilen mit Volltextsuche, Level-Filter und
optionalem Nachladen.

Nicht in die Datenbank geschrieben, obwohl das naheliegt: ein Log muss
genau dann noch funktionieren, wenn die Datenbank es nicht tut. Ein
Handler, der nach MySQL schreibt, verschluckt ausgerechnet die Meldung
"Datenbank nicht erreichbar" - also die, wegen der man nachsieht. Was
strukturiert ausgewertet werden soll, steht ohnehin in automation_log.

Gelesen wird rueckwaerts in Bloecken: 5000 Zeilen aus der 329 MB grossen
Datei der Wallbox kosten 46 ms, weil nur das Ende angefasst wird. Sucht
man ins Leere, bricht der Server nach 4 MB ab und sagt es auch.

Die beiden Prozesse formatieren unterschiedlich - der eine stellt das
Level voran, der andere den Zeitstempel -, deshalb wird beides gesucht
statt an fester Stelle erwartet. Zeilen ohne eigenes Level erben das der
Zeile darueber, sonst filterte "nur Fehler" die Tracebacks weg, die den
Fehler erklaeren.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-03 19:26:56 +02:00
co-authored by Claude Opus 5
parent abfa84dff8
commit cbc9353f0a
7 changed files with 777 additions and 1 deletions
+61
View File
@@ -906,3 +906,64 @@ input[type='range']::-webkit-slider-runnable-track {
}
.skoda-alter { font-size: .85rem; }
/* === Protokollseite ======================================================
Ein Log liest sich nur in einer Schrift mit fester Breite: die Zeitstempel
stehen dann untereinander, und das Auge findet die Stelle, an der etwas
anders wird. Die Zeilen umbrechen statt seitlich zu scrollen - ein
Traceback ist lang, und waagerecht zu blaettern verliert man sofort. */
.log-ausgabe {
max-height: calc(100vh - 22rem);
min-height: 20rem;
overflow-y: auto;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: .78rem;
line-height: 1.45;
background: var(--bs-body-bg, #1b1e21);
border: 1px solid var(--bs-border-color, #2c3034);
border-radius: .375rem;
}
.log-ausgabe .log-zeile {
display: flex;
gap: .6rem;
padding: .1rem .6rem;
border-left: 3px solid transparent;
white-space: pre-wrap;
word-break: break-word;
}
.log-ausgabe .log-zeile:hover { background: rgba(255, 255, 255, .04); }
.log-ausgabe .log-zeit { flex: 0 0 5rem; color: var(--bs-secondary-color, #8b9198); }
.log-ausgabe .log-level { flex: 0 0 4.5rem; font-weight: 600; }
.log-ausgabe .log-text { flex: 1 1 auto; }
/* Fortsetzungszeilen - die zweite bis letzte Zeile eines Tracebacks - tragen
kein eigenes Level. Sie bleiben in der Farbe ihrer Kopfzeile, ruecken aber
ein: so sieht man auf einen Blick, was zusammengehoert. */
.log-ausgabe .log-fortsetzung .log-text { padding-left: 1.2rem; opacity: .85; }
.log-ausgabe .log-debug { color: var(--bs-secondary-color, #8b9198); }
.log-ausgabe .log-info .log-level { color: #6ea8dc; }
.log-ausgabe .log-warning { border-left-color: #d9a441; background: rgba(217, 164, 65, .07); }
.log-ausgabe .log-warning .log-level { color: #d9a441; }
.log-ausgabe .log-error { border-left-color: #e06060; background: rgba(224, 96, 96, .09); }
.log-ausgabe .log-error .log-level { color: #f08a8a; }
/* Tagestrenner: das Datum steht einmal da, nicht in jeder Zeile. */
.log-ausgabe .log-tag {
position: sticky;
top: 0;
padding: .15rem .6rem;
font-size: .72rem;
letter-spacing: .04em;
color: var(--bs-secondary-color, #8b9198);
background: var(--bs-tertiary-bg, #23272b);
border-top: 1px solid var(--bs-border-color, #2c3034);
border-bottom: 1px solid var(--bs-border-color, #2c3034);
}
/* Die Dateiliste links: der aktive Eintrag wird von AdminLTE eingefaerbt,
die Zustandszeile darunter soll trotzdem lesbar bleiben. */
.log-liste .log-wahl.active .text-secondary,
.log-liste .log-wahl.active .text-warning { color: rgba(255, 255, 255, .75) !important; }