SDK Go com utilitários reutilizáveis para logging, tracing e integrações.
Resumo
- Fachada de logging pública em
log/para desacoplar consumidores de implementações concretas (por exemplozerolog). - Implementações concretas ficam em
log/internal(não exportadas). - Helpers de trace e propagation em
trace/. - Exemplos em
examples/e alvos úteis noMakefile.
Estrutura principal
log/— pacote de fachada:facade.go, testes e documentação (log/README.md).log/adapter/— adaptadores públicos que retornamLoggerFacade(ex.:NewLog,NewDefaultLog).log/internal/— implementações concretas (por exemplointernal/backend/zerolog.go).log/middleware/,log/util/— middlewares e helpers relacionados a logging.
trace/— helpers de propagation (ContextWithTrace,TraceIDFromContext,GenerateTraceID).examples/— exemplos executáveis (ex.:examples/logger/main.go).Makefile— targets comuns:test,test-v,test-race,cover,cover-html,fmt,vet,build,tidy,ci,run-example.
Logging: API rápida
- Construtores (adapter):
adapter.NewLog(w io.Writer, level)— cria umLoggerFacadeque escreve paraw.adapter.NewDefaultLog()— cria um logger com configurações padrão.
- Context helpers (em
traceelog):trace.ContextWithTrace,trace.TraceIDFromContext,trace.GenerateTraceID— propagation de trace id.log.ContextWithLogger(ctx, l),log.LoggerFromContext(ctx),log.FromContext(ctx)— injeção/recuperação deLoggerFacade.
- Helpers de campos:
WithField,WithFields(disponíveis noLoggerFacade). - Erros: use
LoggerFacade.Error(err)seguido deMsg/Msgfpara incluir o campoerrorno payload. Ex.:f.Error(err).Msg("failed")ouf.WithFields(...).Error(err).Msgf("failed %s", name). - Globais/atalhos:
log.SetGlobal(l),log.GetGlobal()e helpers de nívellog.Debug()/Info()/Warn()/Error(err)que retornam umLogEventfluente.
Adicionando um adapter
- Para suportar outra biblioteca, adicione um adaptador em
log/adapter/que construa/retorne umlog.LoggerFacade. - Mantenha a dependência concreta dentro de
log/internalquando for necessário usar bibliotecas externas.
Testes e desenvolvimento
- Coloque testes ao lado do código (
*_test.go). Usebytes.Bufferehttptestpara capturar saída e comportamento HTTP. - Se um teste alterar o logger global (
log.SetGlobal), restaure o valor anterior comdefer log.SetGlobal(prev). - Alvos úteis:
make test— roda todos os testes.make test-v— testes em modo verbose.make test-race— com detector de race e cobertura.make run-example— executaexamples/logger(useLOG_LEVELpara alterar o nível).
Formatação e análise estática
- Rode
make fmt(gofmt) emake vet(go vet) antes de submeter mudanças.
Build / CI
make build— compila os pacotes.make ci— target para CI que executafmt,vetetest.
Boas práticas
- Prefira usar a abstração
log.LoggerFacadenas bibliotecas para não acoplar consumidores a uma implementação concreta. - Mantenha implementações concretas em
log/internalpara evitar vazamento de dependências. - O logger global é armazenado com
sync/atomic.Value: definir o global uma vez no startup é a prática recomendada; swaps em runtime são suportados mas use com cuidado.
Exemplos e documentação adicional
- Veja
examples/loggerpara um exemplo de uso. - Consulte
log/README.mdpara documentação detalhada da fachada e exemplos de adapters.
Licença e contato
- Ver
LICENSE(se presente) e abra issues/pull requests para contribuições.