Documentation
¶
Overview ¶
Package logger fornece uma interface unificada para logging estruturado que pode ser implementada por diferentes bibliotecas de logging.
O pacote utiliza o padrão Adapter para permitir que diferentes implementações de logging (como logrus, zap, slog, etc.) sejam utilizadas através de uma interface comum, com suporte completo a observabilidade, middlewares HTTP e conformidade LGPD.
Características principais:
- Interface fluente com method chaining
- Suporte a logging estruturado com campos tipados
- Níveis de log padrão (DEBUG, INFO, WARN, ERROR, FATAL)
- Propagação de contexto
- Campos pré-definidos por instância
- Logger global thread-safe
- Perfis de configuração pré-definidos (development, staging, production)
- Observabilidade integrada (Datadog, ELK Stack)
- Middlewares para frameworks HTTP (Gin, Fiber, Chi)
- Integração com PostgreSQL via PGX
- Sanitização LGPD automática
- Correlation IDs e distributed tracing
Uso Básico ¶
Inicialização rápida com perfis pré-configurados:
// Inicialização para produção (Datadog + ELK habilitados)
err := logger.InitWithProfile("production", "my-service")
if err != nil {
panic(err)
}
ctx := context.Background()
// Usar o logger global
logger.Info(ctx).
Str("user_id", "123").
Int("attempt", 1).
Msg("User login successful")
Configuração Manual ¶
Para configuração personalizada:
config := logger.NewConfig()
config.ServiceName = "auth-service"
config.Environment = "production"
config.LogLevel = logger.INFO
// Habilitar observabilidade
config.Observability.Enabled = true
config.Observability.EnableDatadog = true
config.Observability.EnableELK = true
err := logger.Init(config)
if err != nil {
panic(err)
}
Logger com Campos Pré-definidos ¶
Criar instâncias com campos comuns:
// Logger com campos comuns
userLogger := logger.WithFields(map[string]interface{}{
"service": "auth",
"version": "1.0.0",
})
// Todos os logs incluirão os campos pré-definidos
userLogger.Error(ctx).
Err(err).
Msg("Authentication failed")
Middlewares HTTP ¶
O pacote inclui middlewares para frameworks populares:
// Gin r.Use(middlewares.GinLogger()) // Fiber app.Use(middlewares.FiberLogger()) // Chi r.Use(middlewares.ChiLogger())
Implementando um Adapter Personalizado ¶
Para implementar um novo adapter, implemente a interface core.LoggerAdapter:
type MyAdapter struct {
// campos necessários
}
func (a *MyAdapter) Log(ctx context.Context, level core.Level, msg string, fields map[string]interface{}) {
// implementação específica
}
func (a *MyAdapter) WithContext(ctx context.Context) core.LoggerAdapter {
// retornar nova instância com contexto
}
func (a *MyAdapter) IsLevelEnabled(level core.Level) bool {
// verificar se o nível está habilitado
}
Configuração via Variáveis de Ambiente ¶
O pacote suporta configuração através de variáveis de ambiente:
- LOGGER_SERVICE_NAME: Nome do serviço
- LOGGER_ENVIRONMENT: Ambiente (development, staging, production)
- LOGGER_LOG_LEVEL: Nível de log (debug, info, warn, error, fatal)
- LOGGER_OUTPUT: Tipo de saída (stdout, file)
- LOGGER_PRETTY_PRINT: Formatação legível (true/false)
- LOGGER_OBSERVABILITY_ENABLED: Habilitar observabilidade (true/false)
Para carregar configuração do ambiente:
err := logger.InitFromEnv()
if err != nil {
panic(err)
}
Observabilidade ¶
O pacote inclui integração nativa com sistemas de observabilidade:
- Datadog APM para distributed tracing
- ELK Stack para agregação de logs
- Correlation IDs automáticos
- Métricas de performance
- Dashboards pré-configurados
Conformidade LGPD ¶
Sanitização automática de dados sensíveis:
- CPF, CNPJ, emails, telefones
- Dados de cartão de crédito
- Senhas e tokens
- Configuração flexível de campos sensíveis
Index ¶
- Constants
- func Debug(ctx context.Context) core.LogEvent
- func Error(ctx context.Context) core.LogEvent
- func Fatal(ctx context.Context) core.LogEvent
- func Info(ctx context.Context) core.LogEvent
- func Init(config Config) error
- func InitFromEnv() error
- func InitWithObservability(serviceName, environment string, enableDatadog, enableELK bool) error
- func InitWithProfile(profile string, serviceName string) error
- func IsInitialized() bool
- func Warn(ctx context.Context) core.LogEvent
- type Config
- type Logger
- type LoggerAdapter
- type OutputType
Constants ¶
const ( // DefaultServiceName é o nome padrão do serviço DefaultServiceName = "unknown-service" // DefaultEnvironment é o ambiente padrão DefaultEnvironment = "development" // DefaultLogLevel é o nível de log padrão DefaultLogLevel = core.INFO // DefaultLogFilePath é o caminho padrão do arquivo de log DefaultLogFilePath = "/var/log/app.log" // DefaultOutput é o tipo de saída padrão DefaultOutput = OutputStdout )
Constantes para valores padrão
const ( // EnvServiceName é o nome da variável de ambiente para o nome do serviço EnvServiceName = "LOGGER_SERVICE_NAME" // EnvEnvironment é o nome da variável de ambiente para o ambiente EnvEnvironment = "LOGGER_ENVIRONMENT" // EnvOutput é o nome da variável de ambiente para o tipo de saída EnvOutput = "LOGGER_OUTPUT" // EnvLogLevel é o nome da variável de ambiente para o nível de log EnvLogLevel = "LOGGER_LOG_LEVEL" // EnvLogFilePath é o nome da variável de ambiente para o caminho do arquivo de log EnvLogFilePath = "LOGGER_LOG_FILE_PATH" // EnvTenantID é o nome da variável de ambiente para o tenant ID EnvTenantID = "LOGGER_TENANT_ID" // EnvPrettyPrint é o nome da variável de ambiente para pretty print EnvPrettyPrint = "LOGGER_PRETTY_PRINT" // EnvCallerEnabled é o nome da variável de ambiente para habilitar caller EnvCallerEnabled = "LOGGER_CALLER_ENABLED" // EnvObservabilityEnabled é o nome da variável de ambiente para habilitar observabilidade EnvObservabilityEnabled = "LOGGER_OBSERVABILITY_ENABLED" )
Constantes para nomes de variáveis de ambiente
Variables ¶
This section is empty.
Functions ¶
func Init ¶
Init inicializa o logger global com a configuração especificada Esta função é thread-safe e pode ser chamada múltiplas vezes
func InitFromEnv ¶
func InitFromEnv() error
InitFromEnv inicializa o logger global carregando a configuração de variáveis de ambiente
func InitWithObservability ¶
InitWithObservability inicializa o logger com observabilidade habilitada
func InitWithProfile ¶
InitWithProfile inicializa o logger com um perfil específico
func IsInitialized ¶
func IsInitialized() bool
IsInitialized retorna true se o logger global foi inicializado
Types ¶
type Config ¶
type Config struct {
// ServiceName é o nome do serviço que está gerando os logs
ServiceName string
// Environment é o ambiente onde o serviço está executando (development, staging, production)
Environment string
// Output define onde os logs serão direcionados (stdout, file, ou ambos)
Output OutputType
// LogLevel define o nível mínimo de log que será registrado
LogLevel core.Level
// LogFilePath define o caminho do arquivo de log quando Output inclui OutputFile
LogFilePath string
// TenantID é um identificador opcional para multi-tenancy
TenantID string
// PrettyPrint habilita formatação legível para desenvolvimento
PrettyPrint bool
// CallerEnabled habilita informações do caller nos logs
CallerEnabled bool
// Observability define as configurações de observabilidade
Observability observability.ObservabilityConfig
}
Config define a configuração do sistema de logging
func LoadConfigFromEnv ¶
func LoadConfigFromEnv() Config
LoadConfigFromEnv carrega a configuração a partir de variáveis de ambiente com fallback para valores padrão quando as variáveis não estão definidas
func LoadConfigFromEnvWithValidation ¶
LoadConfigFromEnvWithValidation carrega a configuração de variáveis de ambiente e valida os valores carregados, retornando erro se a configuração for inválida
func NewDevelopmentConfig ¶
NewDevelopmentConfig cria uma configuração otimizada para desenvolvimento
func NewProductionConfig ¶
NewProductionConfig cria uma configuração otimizada para produção
func NewStagingConfig ¶
NewStagingConfig cria uma configuração otimizada para staging
type Logger ¶
type Logger interface {
// Debug cria uma entrada de log de nível DEBUG.
// Usado para informações detalhadas de depuração que normalmente
// só são de interesse ao diagnosticar problemas.
Debug(ctx context.Context) core.LogEvent
// Info cria uma entrada de log de nível INFO.
// Usado para mensagens informativas gerais que destacam
// o progresso da aplicação em um nível grosso.
Info(ctx context.Context) core.LogEvent
// Warn cria uma entrada de log de nível WARN.
// Usado para situações potencialmente prejudiciais que
// merecem atenção mas não impedem a execução.
Warn(ctx context.Context) core.LogEvent
// Error cria uma entrada de log de nível ERROR.
// Usado para eventos de erro que ainda permitem que
// a aplicação continue executando.
Error(ctx context.Context) core.LogEvent
// Fatal cria uma entrada de log de nível FATAL.
// Usado para erros muito severos que provavelmente
// levarão à terminação da aplicação.
Fatal(ctx context.Context) core.LogEvent
// WithContext retorna uma nova instância do logger com o contexto especificado.
// Útil para propagar informações de contexto através de chamadas de log.
WithContext(ctx context.Context) Logger
// WithFields retorna uma nova instância do logger com campos pré-definidos.
// Útil para adicionar campos comuns que serão incluídos em todas as entradas de log.
WithFields(fields map[string]interface{}) Logger
}
Logger define a interface pública para operações de logging. Esta interface fornece métodos para diferentes níveis de log e suporta method chaining através da interface LogEvent.
Exemplo de uso:
logger.Info(ctx).
Str("user_id", "123").
Int("attempt", 1).
Msg("User login successful")
func GetLogger ¶
func GetLogger() Logger
GetLogger retorna o logger global. Se não foi inicializado, inicializa com configuração padrão
func New ¶
func New(adapter LoggerAdapter) Logger
New cria uma nova instância de Logger usando o adapter especificado. O adapter é responsável pela implementação real do logging.
Exemplo:
adapter := &MyLoggerAdapter{}
log := logger.New(adapter)
func WithContext ¶
WithContext retorna um novo logger global com contexto
func WithFields ¶
WithFields retorna um novo logger global com campos pré-definidos
type LoggerAdapter ¶
type LoggerAdapter = core.LoggerAdapter
LoggerAdapter é um alias para core.LoggerAdapter para facilitar o uso
type OutputType ¶
type OutputType int
OutputType define os tipos de saída de log disponíveis
const ( // OutputStdout direciona logs para stdout OutputStdout OutputType = 1 << iota // OutputFile direciona logs para arquivo OutputFile )
func (OutputType) String ¶
func (o OutputType) String() string
String retorna a representação em string do tipo de saída