From 0e94bf4d913ef8face082edfc1e541efdf431b3e Mon Sep 17 00:00:00 2001 From: mm Date: Mon, 14 Sep 2026 10:03:21 +0200 Subject: [PATCH] docs: Error-Log-Erfassung dokumentiert (LogQL-Beispiele, drei stille Fallen) --- README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/README.md b/README.md index 55b3ef1..1617cf7 100644 --- a/README.md +++ b/README.md @@ -480,6 +480,41 @@ Wer kein sudo hat, aber in der Gruppe `docker` ist: Container-Variante aus [netbird-observability/stacks/telegraf-node](https://gitea.m-m.bio/mm/netbird-observability) (privates Repo). Dort ist `network_mode: host` gesetzt — ohne das sieht Telegraf nur `lo`+`eth0` statt der echten Interfaces. +## Error-Logs (seit 1.3.0) + +Apache schreibt **zwei** Logarten mit **verschiedenen** Formaten: + +| Datei | Format | Ziel | +|---|---|---| +| `access.log` | `IP ident auth [HTTPDATE] "VERB REQ" CODE BYTES` | Loki (roh) **und** Prometheus (Metriken) | +| `error.log` | `[Mon Sep 14 00:10:01.123456 2026] [core:error] [pid 9] AH00124: …` | Loki (roh), Tag `logtype=error` | + +Bis 1.2.0 wurden **nur** Access-Logs gesammelt. Nachgemessen: 31 `logfile`-Labels +in Loki, **0** davon `error.log` — auf einem Panel-Host mit PHP/CMS fehlten damit +genau die Fehler, für die man ins Monitoring schaut. + +Error-Logs laufen über einen **eigenen Input**, nicht durch den Access-Grok: das +Format passt nicht, und der Aggregator würde sie sonst in leere Gruppen einordnen. +Sie tragen `logtype=error` und `logfile=` — in Grafana nach beiden filterbar: + +```logql +{node="", logtype="error"} +{node="", logtype="error"} | logfmt | line_format "{{.message}}" |~ "PHP Fatal" +``` + +### Drei stille Fallen, die dabei behoben wurden + +Alle drei hätten dazu geführt, dass die Logs **gesammelt und dann verworfen** +werden — ohne Fehlermeldung: + +1. `processors.rename` hatte `namepass = ["journal"]`. Für `apache_error` hieß + das Feld deshalb `value` statt `message` — jede Query mit `{{.message}}` hätte + es nicht gefunden. +2. `outputs.loki` hatte `namepass = ["docker_log", "apache_log", "journal"]` — + ohne `apache_error`. Der Input sammelt ein, der Output verwirft. +3. `outputs.prometheus` fehlte `apache_error` in `namedrop` — sonst wandern + Textzeilen als Zeitreihen in die TSDB. + ## Alte Logs archivieren (Historie nachträglich auswertbar machen) `inputs.tail` liest mit `initial_read_offset = "saved-or-end"` nur **Neues** — die