Source « Messages du noyau (dmesg) » #20

Merged
claude Bot merged 1 commits from feat/dmesg into main 2026-10-04 09:59:38 +02:00

Requested by Cédric

Résumé

Nouvelle source de logs qui lit le buffer noyau de l'hôte via /dev/kmsg, comme dmesg. Elle est désactivée par défaut et s'active dans Paramètres > Sources > Messages du noyau (dmesg), sur le modèle de la source « Logs système de l'hôte ».

  • dmesg.go : lit les enregistrements prio,seq,usec,flags;message avec les lignes de dictionnaire SUBSYSTEM= / DEVICE= et décode les échappements \xNN. Le temps monotone (µs depuis le démarrage) est converti en heure réelle via /proc/uptime.
  • Reprise sans doublon : le dernier numéro de séquence et le boot_id sont enregistrés dans /data/dmesg-state.json. Au redémarrage de Logstream, les messages déjà envoyés sont ignorés. Après un reboot de l'hôte, le nouveau buffer est lu depuis DMESG_BACKFILL (1h par défaut). Les trous de séquence (messages écrasés avant lecture) sont comptés et affichés.
  • Erreurs gérées sans planter : si /dev/kmsg est absent (not_found) ou refusé (permission), un message explicite s'affiche dans Paramètres > Sources (FR/EN), une seule ligne est écrite dans les logs et l'ouverture est retentée toutes les 10 s.
  • Champs : app kernel, ou le nom du programme pour systemd[1]: …. Sévérité et facility viennent de prio, host vaut localhost, proto kmsg, avec subsystem/device en champs supplémentaires. Nouveau source_type kernel, ajouté au filtre Source (« Noyau (dmesg) »).
  • API : GET/PUT /api/dmesg. Config dans /data/dmesg.json. Variables DMESG_BACKFILL et DMESG_DEVICE.
  • docker-compose.yml (commenté) et .env.example : devices: /dev/kmsg:/dev/kmsg:r. Si l'hôte a kernel.dmesg_restrict=1, il faut soit sysctl kernel.dmesg_restrict=0 sur l'hôte, soit user: "0:0" + cap_add: [SYSLOG].
  • README EN/FR : nouvelle section, tableau de configuration et organisation du code.

Tests

  • go vet (darwin et linux), go build, go test -race ./... : OK. Les tests dmesg ont aussi été lancés 20 fois de suite sous -race.
  • Tests unitaires du parseur kmsg (en-tête, dictionnaire, échappements, entrées invalides), de la conversion en Entry, du backfill, de la reprise par seq/boot_id, du changement de boot, de DMESG_BACKFILL=0, de la boucle Run complète, du périphérique absent et de l'accès refusé.
  • JS : syntaxe de web/app.js vérifiée sous jsc, parité des clés i18n FR/EN, rendu des messages d'état.
  • Non testé ici (pas de Docker) : la lecture réelle de /dev/kmsg dans un conteneur Linux.

🤖 Generated with Claude Code

<!-- ccr-projects-attribution: {"github_login":"vblogio"} --> _Requested by **Cédric**_ ## Résumé Nouvelle source de logs qui lit le buffer noyau de l'hôte via `/dev/kmsg`, comme `dmesg`. Elle est **désactivée par défaut** et s'active dans **Paramètres > Sources > Messages du noyau (dmesg)**, sur le modèle de la source « Logs système de l'hôte ». - `dmesg.go` : lit les enregistrements `prio,seq,usec,flags;message` avec les lignes de dictionnaire ` SUBSYSTEM=` / ` DEVICE=` et décode les échappements `\xNN`. Le temps monotone (µs depuis le démarrage) est converti en heure réelle via `/proc/uptime`. - **Reprise sans doublon** : le dernier numéro de séquence et le `boot_id` sont enregistrés dans `/data/dmesg-state.json`. Au redémarrage de Logstream, les messages déjà envoyés sont ignorés. Après un reboot de l'hôte, le nouveau buffer est lu depuis `DMESG_BACKFILL` (1h par défaut). Les trous de séquence (messages écrasés avant lecture) sont comptés et affichés. - **Erreurs gérées sans planter** : si `/dev/kmsg` est absent (`not_found`) ou refusé (`permission`), un message explicite s'affiche dans Paramètres > Sources (FR/EN), une seule ligne est écrite dans les logs et l'ouverture est retentée toutes les 10 s. - Champs : app `kernel`, ou le nom du programme pour `systemd[1]: …`. Sévérité et facility viennent de `prio`, host vaut `localhost`, proto `kmsg`, avec `subsystem`/`device` en champs supplémentaires. Nouveau `source_type` `kernel`, ajouté au filtre **Source** (« Noyau (dmesg) »). - API : `GET/PUT /api/dmesg`. Config dans `/data/dmesg.json`. Variables `DMESG_BACKFILL` et `DMESG_DEVICE`. - `docker-compose.yml` (commenté) et `.env.example` : `devices: /dev/kmsg:/dev/kmsg:r`. Si l'hôte a `kernel.dmesg_restrict=1`, il faut soit `sysctl kernel.dmesg_restrict=0` sur l'hôte, soit `user: "0:0"` + `cap_add: [SYSLOG]`. - README EN/FR : nouvelle section, tableau de configuration et organisation du code. ## Tests - `go vet` (darwin et linux), `go build`, `go test -race ./...` : OK. Les tests dmesg ont aussi été lancés 20 fois de suite sous `-race`. - Tests unitaires du parseur kmsg (en-tête, dictionnaire, échappements, entrées invalides), de la conversion en Entry, du backfill, de la reprise par seq/boot_id, du changement de boot, de `DMESG_BACKFILL=0`, de la boucle `Run` complète, du périphérique absent et de l'accès refusé. - JS : syntaxe de `web/app.js` vérifiée sous jsc, parité des clés i18n FR/EN, rendu des messages d'état. - Non testé ici (pas de Docker) : la lecture réelle de `/dev/kmsg` dans un conteneur Linux. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude Bot added 1 commit 2026-10-04 09:52:44 +02:00
New source in Settings > Sources, off by default: reads the kernel ring
buffer of the host through /dev/kmsg, dates records from the boot time and
resumes after the last sequence number of the same boot (no duplicates on
restart). Missing device or denied access is shown in the UI, retried every
10 s. docker-compose.yml and .env.example document the device and the
kernel.dmesg_restrict / CAP_SYSLOG options.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
claude Bot marked the pull request as ready for review 2026-10-04 09:59:25 +02:00
claude Bot merged commit f3373e1f66 into main 2026-10-04 09:59:38 +02:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vLab-BZH/logstream#20