diff --git a/.env.example b/.env.example index 759ee28..d58e8c8 100644 --- a/.env.example +++ b/.env.example @@ -67,3 +67,7 @@ DMESG_BACKFILL=1h AUDIT_BACKFILL=1h # Host name of the audit events (empty: node= of the records, else /host/etc/hostname, else localhost) AUDIT_HOST= +# Log files of other programs (Traefik, nginx, applications…), declared in Settings > Log sources > +# Log files: mount their directory read-only in docker-compose.yml (e.g. /var/log/traefik:/logs/traefik:ro). +# History read when a file is turned on (e.g. 30m, 1h, 24h; 0 = only new lines) +FILES_BACKFILL=1h diff --git a/README.fr.md b/README.fr.md index 9fa890d..e114a3c 100644 --- a/README.fr.md +++ b/README.fr.md @@ -289,10 +289,64 @@ source est **désactivée par défaut** : activez-la dans **Réglages > Sources enregistrés dans `/data/audit-state.json` : après un redémarrage, la lecture reprend là ; après une rotation par auditd, la fin de `audit.log.1` est lue avant le nouveau fichier. +## Fichiers de logs (Traefik, nginx, applications…) + +Logstream peut suivre les fichiers de logs d'autres programmes : Traefik, nginx, Apache, ou +toute application qui écrit dans un fichier. Déclarez chaque fichier dans **Paramètres > Sources +de logs > Fichiers de logs** (enregistré dans `/data/files.json`, 50 au plus) : un **nom** (l'**app** +de ses entrées), le **chemin** tel que monté dans le conteneur, un **format**, un **hôte** +facultatif (par défaut `/host/etc/hostname`, sinon `localhost`) et un interrupteur. + +- **Montage** du dossier en lecture seule, par ex. dans `docker-compose.yml` : + `- /var/log/traefik:/logs/traefik:ro`, puis `docker compose up -d`. Les fichiers de `/var/log` + sont déjà accessibles sous `/host/var/log/…`. Les fichiers doivent être lisibles par l'UID + `10001` ou le groupe de `HOST_LOGS_GID` (`adm` par défaut) ; Paramètres > Sources de logs + indique quand aucun fichier ne correspond ou que l'accès est refusé. +- **Chemin** : un fichier, ou un motif avec `*`, `?` ou `[…]` : `/logs/traefik/*.log` suit tous + les fichiers `.log` du dossier, y compris ceux créés plus tard (200 fichiers au plus par + motif). Les copies de rotation (`.1`, `.2.gz`…) sont ignorées. +- **Formats** : + - *Texte brut* : une entrée par ligne ; le niveau est détecté comme pour les logs Docker, un + horodatage en début de ligne (ISO 8601, `2006/01/02 15:04:05`, `[02/Jan/2006:15:04:05 +0200]`, + `Jan 2 15:04:05`) devient l'heure du message et est retiré du message. Les lignes indentées + (stack traces) sont rattachées à l'entrée précédente. + - *JSON lines* : `msg` / `message`, `time` / `ts` / `@timestamp` (texte ou heure Unix) et + `level` (mot ou nombre, pino/bunyan compris) sont reconnus ; les autres clés deviennent des + champs, les objets imbriqués avec des noms pointés (`req.id`). + - *logfmt* : paires `clé=valeur`, comme les logs par défaut de Traefik ou des programmes Go ; + mêmes clés que le JSON. + - *Journal d'accès (CLF)* : Common / Combined Log Format de nginx et Apache, et le journal + d'accès de Traefik dans ce format (routeur, URL du serveur et durée compris). Champs + `client_ip`, `http_method`, `http_path`, `http_status`, `http_size`, `user_agent`, + `http_referer`, `router`, `backend`, `duration_ms`. + - *Accès Traefik (JSON)* : le journal d'accès JSON de Traefik (`accessLog.format: json`), + résumé en `GET app.example.com/ 200 · 12.5 ms · app@docker · 203.0.113.9`, toutes les clés + dans les champs. Les logs de Traefik lui-même dans le même fichier sont lus comme du JSON. + - *Expression régulière* (syntaxe RE2 / Go) : les groupes nommés `time`, `level`, `msg`, + `host` et `app` remplissent ces champs, `status` donne le niveau d'un journal d'accès, les + autres groupes deviennent des champs, par ex. + `^(?P