Skip to content

Log-Datei: Log in Tagesdateien, einstellbar auf der Log-Seite - #46

Merged
SolarPower2024 merged 6 commits into
load-peak-featuresfrom
feature/log-datei
Oct 5, 2026
Merged

SolarPower2024 merged 6 commits into
load-peak-featuresfrom
feature/log-datei

Conversation

@SolarPower2024

Copy link
Copy Markdown
Owner

Was und warum

evcc hält sein Log nur in einem Ringpuffer mit 10.000 Zeilen. Bei debug reicht das für 1–2 Stunden. Für den Live-Betrieb von evcc custom auf dem Produktivsystem soll das Log mehrere Tage nachvollziehbar sein.

Neu: Log-Datei, einstellbar auf der Log-Seite über einen Knopf neben dem Download.

  • Tagesdateien evcc-YYYY-MM-DD.log. Ältere Tage werden gepackt (.log.gz), Dateien über die Aufbewahrung hinaus gelöscht. Alle Dateien zusammen sind fest auf höchstens 1 GB begrenzt.
  • Level (error … trace, Standard debug) und Aufbewahrung (1–90 Tage, Standard 14) sind in der UI einstellbar. Das Level gilt nur für die Datei, Konsole und Add-on-Log bleiben unverändert.
  • Ordner: /config/logs im Add-on (per Samba unter addon_configs lesbar), sonst logs neben der Datenbank.
  • Beim Einschalten und nach jedem Neustart kommt zuerst der Inhalt des Log-Puffers in die Datei. So sind auch die Startzeilen enthalten, ohne Lücke und ohne doppelte Zeilen.
  • Ohne Einstellung passiert nichts: Es wird keine Datei und kein Ordner angelegt.
  • Schreibfehler (z. B. Platte voll) schalten die Datei für diesen Lauf ab. Der Fehler wird gemeldet, die Regelung läuft weiter.

Konzept: konzepte/2026-10-05-log-datei.md.

Eingriffe in evcc-Dateien

  • util/log.go: Die Logger schreiben an logstash.Output statt an logstash.DefaultHandler. Output gibt jede Zeile unverändert an den Puffer weiter (Vertragstest).
  • cmd/root.go: logstash.CloseFile() vor os.Exit, nachdem die Shutdown-Handler gelaufen sind.
  • assets/js/views/Log.vue: hängt LogFileButton ein.

Alle drei stehen in der Touch-Point-Tabelle und in forkHooks/forkUiHooks. watch.json beobachtet evcc PR 32018 (neuer Logger-Unterbau), weil er den Eingriff in util/log.go betreffen kann.

Tests

  • Go (WSL): core, core/lm/..., core/peak, server, util, util/logstash, cmd grün, auch TestForkHooksInPlace. util/logstash zusätzlich 5× gemischt.
  • Unit-Tests: Level-Filter, Tageswechsel mit Packen, Aufbewahrung, 1-GB-Grenze, Puffer-Dump mit 8 parallelen Schreibern ohne Lücke oder Duplikat, Fehlerfall, inert ohne Einstellung.
  • fecheck.sh: vue-tsc, lint, i18n, vitest 232/232.
  • UI-Steps steps_logfile.mjs gegen einen WSL-Build: Dialog, Einschalten, Datei vorhanden, ungültige Tage werden abgelehnt, Ausschalten.
  • Live in WSL: Einstellung übersteht einen Neustart, Kopfzeile und Startzeilen stehen in der Datei.
  • Nicht gelaufen: -race (wsltest.sh baut ohne cgo). Den Add-on-Pfad /config/logs prüfe ich live beim nächsten Release.

Hinweis

Bei evcc kann eine Zeile, in der ein Geheimnis geschwärzt wird und die auch auf die Konsole geht, im Log-Puffer fehlen: redactWriter meldet eine kürzere Länge, und io.MultiWriter bricht dann ab. Damit fehlt sie auch in der Datei. Das ist bestehendes evcc-Verhalten und wird hier nicht geändert.

Für das Add-on

CHANGELOG:

  • Neu: Log-Datei. Auf der Log-Seite einschaltbar, schreibt das Log in Tagesdateien unter addon_configs/<add-on>/logs (per Samba lesbar). Level und Aufbewahrung sind einstellbar, höchstens 1 GB.

DOCS.md, Abschnitt „Log-Datei“:

Auf der Log-Seite über den Knopf „Log-Datei“ einschalten. Die Dateien liegen in /config/logs, über die Samba-Freigabe unter addon_configs\<slug>_evcc_custom\logs. Ein Tag pro Datei, ältere gepackt, höchstens 1 GB.

🤖 Generated with Claude Code

SolarPower2024 and others added 6 commits October 5, 2026 20:58
…hängt)

fileSink schreibt den Logstrom ab einem eigenen Level in evcc-YYYY-MM-DD.log,
packt die Vortagesdatei im Hintergrund, räumt nach Alter und nach 1 GB auf und
schaltet sich bei Fehlern für den Lauf ab. Output reicht jede Zeile unverändert
an den Ringpuffer der Log-Seite und unter demselben Mutex an die Datei; das
Einschalten schreibt den Pufferinhalt ohne Lücke und ohne Duplikat. SetFile,
FileStatus und CloseFile sind die Schnittstelle. Ohne SetFile passiert nichts.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
newLogger schreibt über logstash.Output statt direkt in den Ringpuffer, runRoot
ruft nach den Shutdown-Funktionen logstash.CloseFile. Vertragstests: eine Zeile
jedes Levels, redigiert, landet in Datei und Log-Seite; der Puffer vor dem
Einschalten ist in der Datei; CloseFile schreibt aus. forkHooks und
Touch-Point-Tabelle um beide Hooks ergänzt.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Key logFile, site.API LogFile/SetLogFile, GET und POST /api/logfile mit
Prüfung von Level und Tagen. restoreLogFile hängt in restoreCustom und schaltet
die Datei nach einem Neustart wieder ein. Ordner: /config/logs, wenn /config ein
Verzeichnis ist, sonst logs neben der Datenbank. Tests: Ordnerwahl, ohne
Einstellung nichts geschrieben, Einstellung übersteht den Neustart, ungültige
Werte, Routen.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
LogFileButton neben dem Download-Knopf zeigt aus oder das Level, der Dialog
schaltet die Datei ein, setzt Level und Aufbewahrung und zeigt Ordner, Anzahl
Dateien, Größe und einen Fehler. Eine Zeile in Log.vue hängt den Knopf ein,
als UI-Hook in forkUiHooks und in der Touch-Point-Tabelle.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Abschnitt 18 beschreibt Verhalten, Ordner, Aufräumen, Fehlerfall und API;
eigene Dateien in der Liste; watch.json beobachtet den Logger-Unterbau
(evcc PR 32018).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…s, Warnungen sofort schreiben

- Einstellung ändern oder wieder einschalten schreibt nur Zeilen, die noch nicht in der Datei sind
- 1 GB gilt auch, während die heutige Datei wächst: ältere Dateien gehen sofort, erreicht die heutige allein die Grenze, pausiert sie bis zum nächsten Tag
- warn und error werden sofort geschrieben, damit die Zeilen vor einem Absturz nicht im Puffer verloren gehen
- Aufbewahrung zählt den heutigen Tag mit (14 Tage = heute und die 13 davor)
- Tageswechsel über die Uhrzeit des nächsten Tages statt Datumsformat pro Zeile
- Test, dass writeWith dasselbe speichert wie Write

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@SolarPower2024
SolarPower2024 merged commit 5d3ef78 into load-peak-features Oct 5, 2026
6 checks passed
@SolarPower2024
SolarPower2024 deleted the feature/log-datei branch October 5, 2026 19:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant