Documentação/Operação
OPERAÇÃO / LOGS

Logs e diagnóstico

Produza logs úteis com console.log(), aplique cor somente quando ela melhora a leitura e evite flood em rotinas repetitivas.

console.logColorContextoAnti-flood

Use console.log() como saída#

O código da aplicação não precisa de Logger.info(), Logger.warn() ou Logger.error().

TSlogs diretos
console.log('[Commands] comando registrado: ping')console.log('[Database] conexão estabelecida')console.log('[API] requisição falhou: status=502')

Color para ênfase visual#

Color formata texto ANSI; console.log() continua sendo o responsável por imprimir.

TSColor.ts
import { Color } from '@ninenity/core'console.log(Color.green('[Database] conectado').bold())console.log(Color.yellow('[WebSocket] reconectando'))console.log(Color.red('[API] falha ao buscar configuração').bold())// Forma funcionalconsole.log(Color('Deploy concluído', 'lightGreen', 'bold'))// Chain vazia com text no finalconsole.log(Color().lightBlue().bold().text('[Core] pronto'))
CoresEstilos
red, green, yellow, blue, magenta, cyan, white, graybold, dim, italic, underline
lightRed, lightGreen, lightYellow, lightBluestrikethrough, inverse, hidden, visible

Inclua contexto útil#

Formato consistente torna busca, dashboard e investigação muito mais simples.

TScontextual logging
function logCommand(input: {  command: string  guildId?: string | null  userId: string  durationMs: number}) {  console.log(    '[Command] name=' + input.command +    ' guild=' + (input.guildId ?? 'dm') +    ' user=' + input.userId +    ' duration=' + input.durationMs + 'ms'  )}logCommand({  command: interaction.commandName,  guildId: interaction.guildId,  userId: interaction.user.id,  durationMs: Date.now() - startedAt})
  • Inclua o módulo ou domínio na tag: [Prompt], [Task:catalog], [Database].
  • Use pares chave=valor para IDs, duração, quantidade e estado.
  • Não registre tokens, cookies, API secrets, conteúdo privado ou payloads completos de usuários.
  • Para erros, registre a mensagem e o ponto da operação; stack completa apenas quando realmente necessária.

Evite flood em reconexões e loops#

A operação continua em frequência normal, mas a comunicação ao usuário pode ser agregada.

TSaviso agregado de WebSocket
const REPORT_INTERVAL = 10 * 60 * 1000let lastReportAt = 0let failedAttempts = 0function onWebSocketFailure(message: string) {  failedAttempts += 1  const now = Date.now()  if (lastReportAt && now - lastReportAt < REPORT_INTERVAL) return  lastReportAt = now  console.log(    '[WebSocket] conexão indisponível; reconexão segue em segundo plano' +    ' attempts=' + failedAttempts +    ' lastError=' + message  )  failedAttempts = 0}

A função de reconexão pode continuar com backoff próprio a cada poucos segundos. O intervalo de dez minutos limita apenas o aviso visível, não a tentativa técnica.

TSresumo de lote
const results = await Promise.allSettled(items.map(processItem))const failed = results.filter(result => result.status === 'rejected')console.log(  '[Import] total=' + results.length +  ' success=' + (results.length - failed.length) +  ' failed=' + failed.length)

Diagnóstico em produção#

SinalPergunta que responde
Boot concluídoO auto-loader e os plugins terminaram?
Comandos registradosQuantos módulos foram aceitos por guild/global?
DuraçãoA operação ficou lenta ou expirou?
Guild e usuárioQual contexto reproduz o problema?
Tentativas agregadasUma integração está instável sem inundar o terminal?