105 lines
2.6 KiB
Go
105 lines
2.6 KiB
Go
package logging
|
|
|
|
import (
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zapcore"
|
|
)
|
|
|
|
var (
|
|
// Logger is the global logger instance
|
|
Logger *zap.Logger
|
|
|
|
// SugaredLogger is the global sugared logger instance
|
|
SugaredLogger *zap.SugaredLogger
|
|
)
|
|
|
|
// Init initializes the logger with the specified level and config
|
|
func Init(level string, jsonOutput bool) {
|
|
var config zap.Config
|
|
|
|
// Set the log level
|
|
logLevel := zap.NewAtomicLevel()
|
|
err := logLevel.UnmarshalText([]byte(level))
|
|
if err != nil {
|
|
logLevel.SetLevel(zap.InfoLevel)
|
|
}
|
|
|
|
if jsonOutput {
|
|
// JSON output for Grafana Loki
|
|
config = zap.Config{
|
|
Level: logLevel,
|
|
Development: false,
|
|
Sampling: nil,
|
|
Encoding: "json",
|
|
EncoderConfig: zapcore.EncoderConfig{
|
|
MessageKey: "msg",
|
|
LevelKey: "level",
|
|
TimeKey: "time",
|
|
NameKey: "logger",
|
|
CallerKey: "caller",
|
|
FunctionKey: zapcore.OmitKey,
|
|
StacktraceKey: "stacktrace",
|
|
SkipLineEnding: false,
|
|
LineEnding: zapcore.DefaultLineEnding,
|
|
EncodeLevel: zapcore.LowercaseLevelEncoder,
|
|
EncodeTime: zapcore.ISO8601TimeEncoder,
|
|
EncodeDuration: zapcore.StringDurationEncoder,
|
|
EncodeCaller: zapcore.ShortCallerEncoder,
|
|
},
|
|
OutputPaths: []string{"stdout"},
|
|
ErrorOutputPaths: []string{"stderr"},
|
|
InitialFields: map[string]interface{}{"service": "music-server"},
|
|
}
|
|
} else {
|
|
// Human-readable output for development
|
|
config = zap.Config{
|
|
Level: logLevel,
|
|
Development: true,
|
|
Sampling: nil,
|
|
Encoding: "console",
|
|
EncoderConfig: zapcore.EncoderConfig{
|
|
MessageKey: "msg",
|
|
LevelKey: "level",
|
|
TimeKey: "time",
|
|
NameKey: "logger",
|
|
CallerKey: "caller",
|
|
FunctionKey: zapcore.OmitKey,
|
|
StacktraceKey: "stacktrace",
|
|
SkipLineEnding: false,
|
|
LineEnding: zapcore.DefaultLineEnding,
|
|
EncodeLevel: zapcore.CapitalLevelEncoder,
|
|
EncodeTime: zapcore.ISO8601TimeEncoder,
|
|
EncodeDuration: zapcore.StringDurationEncoder,
|
|
EncodeCaller: zapcore.ShortCallerEncoder,
|
|
},
|
|
OutputPaths: []string{"stdout"},
|
|
ErrorOutputPaths: []string{"stderr"},
|
|
InitialFields: map[string]interface{}{"service": "music-server"},
|
|
}
|
|
}
|
|
|
|
logger, err := config.Build()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
Logger = logger
|
|
SugaredLogger = logger.Sugar()
|
|
}
|
|
|
|
// GetLogger returns the global logger
|
|
func GetLogger() *zap.Logger {
|
|
if Logger == nil {
|
|
Init("info", false)
|
|
}
|
|
return Logger
|
|
}
|
|
|
|
// GetSugaredLogger returns the global sugared logger
|
|
func GetSugaredLogger() *zap.SugaredLogger {
|
|
if SugaredLogger == nil {
|
|
Init("info", false)
|
|
}
|
|
return SugaredLogger
|
|
}
|