Logs
O que o servidor escreve, em JSON, e onde ler.
Descreve o Ronne AI Marketplace 0.4.0. Traduzida do inglês.
Logs
O Ronne escreve uma linha por evento na saída padrão, em JSON: quando aconteceu, a gravidade, o que aconteceu e a requisição a que pertence. Para onde essa saída vai depende de como o Ronne roda:
| O Ronne roda como | Os logs |
|---|---|
| Docker | docker compose logs web (o driver de log do Docker) |
| Um serviço no Linux | sudo rmk-server service logs, ou journalctl -u rmk-server |
| Um serviço no macOS | sudo rmk-server service logs, ou /Library/Logs/rmk-server/server.log |
| npm ou um pacote com o Node.js embutido, sem serviço | o terminal que roda rmk-server start |
| Um clone | o terminal que roda pnpm start, ou pnpm dev (em texto) |
Uma linha é assim:
{"time":"2026-10-14T14:03:22.417Z","level":"info","msg":"Released","domain":"submissions","event":"version.released","requestId":"01K7…","userId":"01J9…","count":3}- Sempre:
time(UTC),levelemsg, uma frase curta que nunca muda. - Quando se aplicam:
event, um nome estável para buscar e criar alertas;domain, a parte do Ronne que a escreveu;requestId, a requisição a que pertence;userId, quem a fez (um id, nunca um e-mail ou um nome);err, o nome, a mensagem e o código de um erro, com a pilha emerror; com o rastreamento ligado,traceIdespanId, o span em que foi escrita (Monitoramento). - Os campos do próprio evento: números, contagens e motivos curtos, como
statusoucount. - As linhas do próprio Better Auth (a biblioteca de login):
msgéBetter Auth, comsourcee o texto dele emdetail.
LOG_LEVEL (debug, info, warn ou error; info por padrão) define a gravidade mínima das linhas escritas: warn é o que alguém deve olhar, error uma falha, e debug acrescenta detalhes que ninguém precisa no dia a dia. Um valor desconhecido escreve um aviso e usa info. LOG_FORMAT é json, ou text para uma pessoa lendo um terminal (o padrão com pnpm dev). Defina-os no arquivo de configurações ou no ambiente (com Docker, no arquivo .env ao lado do compose.yaml, depois docker compose up -d), e reinicie o Ronne.
Os eventos:
| Evento | Nível | Quando | Campos |
|---|---|---|---|
server.started | info | O servidor iniciou (antes do setup, setup: required no lugar de dialect) | version, dialect, setup, runtime, port |
server.migrations_applied | info | Mudanças no banco aplicadas ao iniciar | count, latest |
http.request | info (warn para 429, error para 5xx) | Uma requisição à API foi respondida | method, route, status, ms, userId |
http.error | error | Um erro inesperado | err, route |
auth.signed_in | info | Alguém fez login | userId |
auth.sign_in_failed | warn | Um login falhou (via é cli para o rmk login; reason é two_factor_required quando o rmk login enviou a senha certa de uma conta com login em duas etapas) | reason, via |
auth.rate_limited | warn | Logins ou pedidos de token demais | limit |
auth.two_factor_started | info | Alguém começou a configurar o login em duas etapas | userId |
auth.two_factor_enabled | info | O login em duas etapas foi ativado | userId |
auth.two_factor_disabled | info | O login em duas etapas foi desativado | userId |
auth.two_factor_failed | warn | Um código de duas etapas foi recusado no login | reason (wrong_code, used, expired, too_many, locked, refused, unreadable) |
token.exchanged | info | O rmk login, ou uma aprovação no navegador, recebeu um token de acesso | userId |
token.rejected | warn | Um token de acesso foi recusado | reason (unknown, revoked, expired, disabled) |
version.released | info | Versões foram lançadas (uma linha por lançamento em lote) | count, userId |
version.yanked | info | Uma versão foi retirada | userId |
draft.uploaded | info | Um rascunho foi enviado | files, bytes |
draft.upload_refused | warn | O envio de um rascunho foi recusado | reason |
upload.rate_limited | warn | Envios ou submissões demais | limit |
usage.rate_limited | warn | Relatórios de uso demais | limit |
submission.checks_failed | warn | As verificações do Submit não puderam rodar | err |
feed.built | info (debug quando vem do cache) | Um feed de plugins foi gerado, ou servido do cache (cached, sem plugins nem ms) | tool, plugins, ms, bytes, cached |
feed.size_warning | warn | Um feed está perto do limite de tamanho | tool, percent |
feed.plugin_skipped | warn | Um plugin ficou de fora de um feed | tool, reason |
db.unavailable | error | A verificação de saúde não alcançou o banco | err |
storage.unavailable | error | A verificação de saúde encontrou o armazenamento não gravável | err |
telemetry.started | info | O OpenTelemetry iniciou (Monitoramento) | traces, metrics |
telemetry.endpoint_invalid | warn | O endpoint OTLP não é uma URL http(s); a telemetria fica desligada | |
telemetry.failed | error | O OpenTelemetry não iniciou; o servidor inicia sem ele | err |
telemetry.verbose_off | warn | NEXT_OTEL_VERBOSE é desligado: spans detalhados levariam nomes privados | |
telemetry.export_failed | warn | O coletor não foi alcançado (no máximo uma vez por minuto) | signal |
job.started | info | Uma tarefa agendada começou (Privacidade: a limpeza de retenção) | job |
job.finished | info | Uma tarefa agendada terminou, com o que fez | job, ms, ipsCleared, emailsCleared, sessionsDeleted, grantsDeleted |
job.skipped | debug | Outra execução segura o bloqueio da tarefa | job, reason |
job.failed | error | Uma tarefa agendada falhou; a próxima roda no horário | job, ms, err |
log.level_invalid | warn | LOG_LEVEL não é um nível; usa-se info |
Nunca numa linha: senhas, tokens de acesso, cookies, AUTH_SECRET, a senha de um banco, e-mails, endereços IP de pessoas, nem os nomes de itens, escopos e espaços de trabalho (os nomes de um espaço de trabalho privado continuam privados). O Ronne não os escreve, e o logger ainda tira o que poderia escapar, mensagens de erro incluídas: campos com nome de segredo, tokens de acesso, senhas em endereços, e-mails, os caminhos dos arquivos guardados e o valor que um banco cita num erro de chave duplicada. O Next.js também imprime um erro inesperado por conta própria, em texto simples ao lado da linha do Ronne: esse texto é do próprio Next.js, fora do logger do Ronne. O mesmo vale para o erro que o Better Auth (a biblioteca de login) imprime quando o próprio banco falha no meio de uma requisição.
Para relatar um problema: toda resposta de página e da API traz um cabeçalho X-Request-Id, e a mensagem da API para um erro inesperado o menciona. Informe-o, e quem administra a instância encontra as linhas dessa requisição pelo requestId. Atrás de um proxy que define o próprio X-Request-Id, o Ronne o mantém com TRUST_PROXY=true, para que um só ID acompanhe a requisição.