criado eLog

This commit is contained in:
Luiz Silva 2026-06-17 09:33:58 -03:00
parent 7e06927ca6
commit 5bfc913d65
8 changed files with 326 additions and 3 deletions

135
src/eLog.ts Normal file
View file

@ -0,0 +1,135 @@
/** Níveis de severidade para o sistema de log estruturado. */
export enum NivelLog {
/** O mais baixo nível, ideal para rastreamento detalhado de fluxo e execução. */
RASTREAMENTO = "RASTREAMENTO",
/** Usado para informações que ajudam a entender o estado do sistema durante a execução. */
DEPURACAO = "DEPURACAO",
/** Informações gerais e eventos do sistema. */
INFORMACAO = "INFORMACAO",
/** Eventos inesperados, mas que não impedem o funcionamento do sistema. */
AVISO = "AVISO",
/** Erros que impactam o funcionamento do sistema, mas que podem ser recuperados. */
ERRO = "ERRO",
/** O nível mais alto de severidade, indicando falhas que requerem atenção imediata. */
CRITICO = "CRITICO",
}
type DetalheNivel = {
peso: number
rotulo: string
emoji: string
metodo: "debug" | "info" | "warn" | "error"
}
/** Detalhes de cada nível de log — peso para filtragem, emoji e método do console. */
export const NivelLogDetalhes: Record<NivelLog, DetalheNivel> = {
[NivelLog.RASTREAMENTO]: { peso: 1, rotulo: "Rastreamento", emoji: "🔍", metodo: "debug" },
[NivelLog.DEPURACAO]: { peso: 2, rotulo: "Depuração", emoji: "🐛", metodo: "debug" },
[NivelLog.INFORMACAO]: { peso: 3, rotulo: "Informação", emoji: "ℹ️", metodo: "info" },
[NivelLog.AVISO]: { peso: 4, rotulo: "Aviso", emoji: "⚠️", metodo: "warn" },
[NivelLog.ERRO]: { peso: 5, rotulo: "Erro", emoji: "❌", metodo: "error" },
[NivelLog.CRITICO]: { peso: 6, rotulo: "Crítico", emoji: "🔥", metodo: "error" },
}
/** Estrutura de uma entrada de log emitida pelo sistema. */
export type EntradaLog = {
timestamp: string
nivel: keyof typeof NivelLog
/** Identificador da aplicação/instância (ex: "front:e-licencie:12345"). */
app: string
/** Local no código de onde o log foi emitido (ex: "criarUsuario()"). */
origem: string
mensagem: string
dados?: unknown
}
/** Interface pública do logger retornado por `iniciarELog`. */
export type ELogger = {
rastreamento: (pr: { origem: string; mensagem: string; dados?: unknown }) => void
depuracao: (pr: { origem: string; mensagem: string; dados?: unknown }) => void
info: (pr: { origem: string; mensagem: string; dados?: unknown }) => void
aviso: (pr: { origem: string; mensagem: string; dados?: unknown }) => void
erro: (pr: { origem: string; mensagem: string; dados?: unknown }) => void
critico: (pr: { origem: string; mensagem: string; dados?: unknown }) => void
}
/** Opções de configuração do logger, disponíveis no callback de arquivamento. */
export type OpoesELogger = {
app: string
nivelMinimo: keyof typeof NivelLog
}
/** Tipo do callback de arquivamento de logs. */
export type ArquivamentoLog = (entrada: EntradaLog, opcoes: OpoesELogger) => void
/**
* Inicializa o sistema de log estruturado.
*
* @param opcoes.app - Identificador da aplicação/instância (ex: `"front:e-licencie:12345"`)
* @param opcoes.nivelMinimo - Nível mínimo para exibição no console (padrão: INFORMACAO)
* @param opcoes.arquivamento - Callback opcional para persistir/enviar as entradas de log
*
* @example
* ```ts
* const log = iniciarELog({ app: "front:e-licencie:12345" })
*
* log.info({ origem: "criarUsuario()", mensagem: "Usuário criado", dados: { id: "abc-123" } })
* // → ℹ️ [Informação] [front:e-licencie:12345] [criarUsuario()] Usuário criado
* ```
*/
export const iniciarELog = (opcoes: {
app: string
nivelMinimo?: keyof typeof NivelLog
arquivamento?: ArquivamentoLog
}): ELogger => {
const nivel: keyof typeof NivelLog = opcoes.nivelMinimo ?? NivelLog.INFORMACAO
const pesoMinimo = NivelLogDetalhes[nivel].peso
const emitir = (
nivelLog: keyof typeof NivelLog,
pr: { origem: string; mensagem: string; dados?: unknown },
) => {
const config = NivelLogDetalhes[nivelLog]
if (config.peso < pesoMinimo) return
const entrada: EntradaLog = {
timestamp: new Date().toISOString(),
nivel: nivelLog,
app: opcoes.app,
origem: pr.origem,
mensagem: pr.mensagem,
...(pr.dados !== undefined ? { dados: pr.dados } : {}),
}
console[config.metodo](
`${config.emoji} [${config.rotulo}] [${opcoes.app}] [${pr.origem}] ${pr.mensagem}`,
pr.dados !== undefined ? pr.dados : "",
)
if (opcoes.arquivamento) {
opcoes.arquivamento(entrada, { app: opcoes.app, nivelMinimo: nivel })
}
}
return {
rastreamento: (pr) => emitir(NivelLog.RASTREAMENTO, pr),
depuracao: (pr) => emitir(NivelLog.DEPURACAO, pr),
info: (pr) => emitir(NivelLog.INFORMACAO, pr),
aviso: (pr) => emitir(NivelLog.AVISO, pr),
erro: (pr) => emitir(NivelLog.ERRO, pr),
critico: (pr) => emitir(NivelLog.CRITICO, pr),
}
}
const log = iniciarELog({
app: "testando",
nivelMinimo: NivelLog.INFORMACAO,
arquivamento: (entrada, opcoes) => {
fetch("https://localhost:3334/debug/log", {
method: "POST",
body: JSON.stringify({ ...entrada, _opcoes: opcoes }),
})
},
})
log.aviso({ origem: "teste", mensagem: "teste" })

View file

@ -5,6 +5,7 @@ export * from "./constantes"
export * from "./consulta"
export * from "./dayjs26"
export * from "./ecosistema"
export * from "./eLog"
export * from "./extensoes"
export * from "./extensoes"
export * from "./filtroDelta"