monorepo/cloud/maplefile-backend/pkg/logger/logger.go

84 lines
2.1 KiB
Go

// codeberg.org/mapleopentech/monorepo/cloud/maplefile-backend/pkg/logger/logger.go
package logger
import (
"os"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// NewProduction creates a production-ready logger with appropriate configuration
func NewProduction() (*zap.Logger, error) {
// Get log level from environment
logLevel := getLogLevel()
// Configure encoder for production (JSON format)
encoderConfig := zapcore.EncoderConfig{
TimeKey: "timestamp",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
FunctionKey: zapcore.OmitKey,
MessageKey: "message",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.RFC3339TimeEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}
// Create core
core := zapcore.NewCore(
zapcore.NewJSONEncoder(encoderConfig),
zapcore.AddSync(os.Stdout),
logLevel,
)
// Create logger with caller information
logger := zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
// Add service information
logger = logger.With(
zap.String("service", "maplefile-backend"),
zap.String("version", getServiceVersion()),
)
return logger, nil
}
// NewDevelopment creates a development logger (for backward compatibility)
func NewDevelopment() (*zap.Logger, error) {
return zap.NewDevelopment()
}
// getLogLevel determines log level from environment
func getLogLevel() zapcore.Level {
levelStr := os.Getenv("LOG_LEVEL")
switch levelStr {
case "debug", "DEBUG":
return zapcore.DebugLevel
case "info", "INFO":
return zapcore.InfoLevel
case "warn", "WARN", "warning", "WARNING":
return zapcore.WarnLevel
case "error", "ERROR":
return zapcore.ErrorLevel
case "panic", "PANIC":
return zapcore.PanicLevel
case "fatal", "FATAL":
return zapcore.FatalLevel
default:
return zapcore.InfoLevel
}
}
// getServiceVersion gets the service version (could be injected at build time)
func getServiceVersion() string {
version := os.Getenv("SERVICE_VERSION")
if version == "" {
return "1.0.0"
}
return version
}