Journaux
Ce que le serveur écrit, en JSON, et où le lire.
Décrit Ronne AI Marketplace 0.4.0. Traduite de l'anglais.
Journaux
Ronne écrit une ligne par événement sur sa sortie standard, en JSON : quand c'est arrivé, sa gravité, ce qui s'est passé et la requête à laquelle elle appartient. L'endroit où va cette sortie dépend de la façon dont Ronne tourne :
| Ronne tourne comme | Ses journaux |
|---|---|
| Docker | docker compose logs web (le pilote de journaux de Docker) |
| Un service Linux | sudo rmk-server service logs, ou journalctl -u rmk-server |
| Un service macOS | sudo rmk-server service logs, ou /Library/Logs/rmk-server/server.log |
| npm ou un paquet avec Node.js intégré, sans service | le terminal qui lance rmk-server start |
| Un clone | le terminal qui lance pnpm start, ou pnpm dev (en texte) |
Une ligne ressemble à ceci :
{"time":"2026-10-14T14:03:22.417Z","level":"info","msg":"Released","domain":"submissions","event":"version.released","requestId":"01K7…","userId":"01J9…","count":3}- Toujours :
time(UTC),leveletmsg, une courte phrase qui ne change jamais. - Quand ils s'appliquent :
event, un nom stable pour chercher et alerter;domain, la partie de Ronne qui l'a écrite;requestId, la requête à laquelle elle appartient;userId, qui l'a faite (un identifiant, jamais un courriel ni un nom);err, le nom, le message et le code d'une erreur, avec sa pile au niveauerror; avec le traçage actif,traceIdetspanId, le span où elle a été écrite (Supervision). - Les champs propres à l'événement : des nombres, des décomptes et de courtes raisons, comme
statusoucount. - Les lignes de Better Auth (la bibliothèque de connexion) :
msgvautBetter Auth, avecsourceet son texte dansdetail.
LOG_LEVEL (debug, info, warn ou error; info par défaut) fixe la gravité minimale des lignes écrites : warn est ce que quelqu'un doit regarder, error une panne, et debug ajoute des détails dont personne n'a besoin au quotidien. Une valeur inconnue écrit un avertissement et utilise info. LOG_FORMAT vaut json, ou text pour une personne qui lit un terminal (par défaut avec pnpm dev). Réglez l'une ou l'autre dans le fichier de réglages ou l'environnement (avec Docker, dans le fichier .env à côté de compose.yaml, puis docker compose up -d), puis redémarrez Ronne.
Les événements :
| Événement | Niveau | Quand | Champs |
|---|---|---|---|
server.started | info | Le serveur a démarré (avant l'installation, setup: required à la place de dialect) | version, dialect, setup, runtime, port |
server.migrations_applied | info | Des changements de base de données ont été appliqués au démarrage | count, latest |
http.request | info (warn pour 429, error pour 5xx) | Une requête à l'API a reçu sa réponse | method, route, status, ms, userId |
http.error | error | Une erreur inattendue | err, route |
auth.signed_in | info | Quelqu'un s'est connecté | userId |
auth.sign_in_failed | warn | Une connexion a échoué (via vaut cli pour rmk login; reason vaut two_factor_required quand rmk login a envoyé le bon mot de passe d'un compte qui a la connexion à deux facteurs) | reason, via |
auth.rate_limited | warn | Trop de connexions ou de demandes de jeton | limit |
auth.two_factor_started | info | Quelqu'un a commencé à configurer la connexion à deux facteurs | userId |
auth.two_factor_enabled | info | La connexion à deux facteurs a été activée | userId |
auth.two_factor_disabled | info | La connexion à deux facteurs a été désactivée | userId |
auth.two_factor_failed | warn | Un code à deux facteurs a été refusé à la connexion | reason (wrong_code, used, expired, too_many, locked, refused, unreadable) |
token.exchanged | info | rmk login, ou une approbation dans le navigateur, a reçu un jeton d'accès | userId |
token.rejected | warn | Un jeton d'accès a été refusé | reason (unknown, revoked, expired, disabled) |
version.released | info | Des versions ont été publiées (une ligne pour une publication en bloc) | count, userId |
version.yanked | info | Une version a été retirée | userId |
draft.uploaded | info | Un brouillon a été téléversé | files, bytes |
draft.upload_refused | warn | Le téléversement d'un brouillon a été refusé | reason |
upload.rate_limited | warn | Trop de téléversements ou de soumissions | limit |
usage.rate_limited | warn | Trop de rapports d'utilisation | limit |
submission.checks_failed | warn | Les vérifications de Submit n'ont pas pu s'exécuter | err |
feed.built | info (debug depuis le cache) | Un plugin feed a été construit, ou servi depuis le cache (cached, sans plugins ni ms) | tool, plugins, ms, bytes, cached |
feed.size_warning | warn | Un plugin feed approche de sa taille limite | tool, percent |
feed.plugin_skipped | warn | Un plugin a été laissé hors d'un plugin feed | tool, reason |
db.unavailable | error | Le contrôle de santé n'a pas joint la base | err |
storage.unavailable | error | Le contrôle de santé a trouvé le stockage non accessible en écriture | err |
telemetry.started | info | OpenTelemetry a démarré (Supervision) | traces, metrics |
telemetry.endpoint_invalid | warn | Le point de terminaison OTLP n'est pas une URL http(s); la télémétrie reste désactivée | |
telemetry.failed | error | OpenTelemetry n'a pas pu démarrer; le serveur démarre sans lui | err |
telemetry.verbose_off | warn | NEXT_OTEL_VERBOSE est désactivé : les spans détaillés porteraient des noms privés | |
telemetry.export_failed | warn | Le collecteur n'a pas pu être joint (au plus une fois par minute) | signal |
job.started | info | Une tâche planifiée a démarré (Confidentialité : la purge de rétention) | job |
job.finished | info | Une tâche planifiée s'est terminée, avec ce qu'elle a fait | job, ms, ipsCleared, emailsCleared, sessionsDeleted, grantsDeleted |
job.skipped | debug | Une autre exécution tient le verrou de la tâche | job, reason |
job.failed | error | Une tâche planifiée a échoué; la suivante aura lieu à l'heure | job, ms, err |
log.level_invalid | warn | LOG_LEVEL n'est pas un niveau; info est utilisé |
Jamais dans une ligne : les mots de passe, les jetons d'accès, les cookies, AUTH_SECRET, le mot de passe d'une base, les courriels, les adresses IP des personnes, ni les noms des éléments, des portées et des espaces de travail (les noms d'un espace privé restent privés). Ronne ne les écrit pas, et son module de journalisation retire en plus ce qui pourrait s'y glisser, messages d'erreur compris : les champs nommés comme un secret, les jetons d'accès, les mots de passe dans les adresses, les courriels, les chemins des fichiers stockés et la valeur qu'une base cite dans une erreur de clé en double. Next.js affiche aussi lui-même une erreur inattendue, en texte brut à côté de la ligne de Ronne : ce texte est celui de Next.js, qui ne passe pas par le module de journalisation de Ronne. De même pour l'erreur que Better Auth (la bibliothèque de connexion) affiche quand la base elle-même échoue pendant une requête.
Signaler un problème : chaque réponse d'une page ou de l'API porte un en-tête X-Request-Id, et le message de l'API pour une erreur inattendue le cite. Donnez-le, et qui administre l'instance retrouve les lignes de cette requête par leur requestId. Derrière un proxy qui pose son propre X-Request-Id, Ronne le garde avec TRUST_PROXY=true, pour qu'un même identifiant suive la requête.