diff options
Diffstat (limited to 'nexus/utils/logger')
| -rw-r--r-- | nexus/utils/logger/defaults.go | 25 | ||||
| -rw-r--r-- | nexus/utils/logger/format.go | 63 | ||||
| -rw-r--r-- | nexus/utils/logger/logger.go | 81 | ||||
| -rw-r--r-- | nexus/utils/logger/messages.go | 5 |
4 files changed, 174 insertions, 0 deletions
diff --git a/nexus/utils/logger/defaults.go b/nexus/utils/logger/defaults.go new file mode 100644 index 0000000..3b00803 --- /dev/null +++ b/nexus/utils/logger/defaults.go @@ -0,0 +1,25 @@ +package logger
+
+const (
+ AnsiReset = "\033[0m"
+)
+
+const (
+ LevelColorDebug = "\033[35mDEBUG \033[0m"
+ LevelColorError = "\033[31mERROR \033[0m"
+ LevelColorInfo = "\033[34mINFO \033[0m"
+ LevelColorWarn = "\033[33mWARN \033[0m"
+)
+
+const (
+ MessageColorDebug = "\033[90m"
+ MessageColorError = "\033[31m"
+ MessageColorInfo = "\033[97m"
+ MessageColorSuccess = "\033[32m"
+ MessageColorWarn = "\033[33m"
+)
+
+const (
+ PrefixColor = "\033[36m"
+ PrefixWidth = 18
+)
diff --git a/nexus/utils/logger/format.go b/nexus/utils/logger/format.go new file mode 100644 index 0000000..f3503df --- /dev/null +++ b/nexus/utils/logger/format.go @@ -0,0 +1,63 @@ +package logger
+
+import (
+ "fmt"
+ "strings"
+
+ "go.uber.org/zap/zapcore"
+)
+
+type LogLevel string
+
+const (
+ LevelDebug LogLevel = "debug"
+ LevelInfo LogLevel = "info"
+ LevelWarn LogLevel = "warn"
+ LevelError LogLevel = "error"
+ LevelSuccess LogLevel = "success"
+)
+
+func formatLevel(level zapcore.Level, encoder zapcore.PrimitiveArrayEncoder) {
+ switch level {
+ case zapcore.DebugLevel:
+ encoder.AppendString(LevelColorDebug)
+ case zapcore.WarnLevel:
+ encoder.AppendString(LevelColorWarn)
+ case zapcore.ErrorLevel:
+ encoder.AppendString(LevelColorError)
+ default:
+ encoder.AppendString(LevelColorInfo)
+ }
+}
+
+func formatPrefix(prefix string) string {
+ if prefix == "" {
+ return ""
+ }
+
+ padding := ""
+ if len(prefix) < PrefixWidth {
+ padding = strings.Repeat(" ", PrefixWidth-len(prefix))
+ }
+
+ return PrefixColor + "[" + prefix + "]" + AnsiReset + padding
+}
+
+func colorizeMessage(level LogLevel, message string) string {
+ switch level {
+ case LevelDebug:
+ return MessageColorDebug + message + AnsiReset
+ case LevelWarn:
+ return MessageColorWarn + message + AnsiReset
+ case LevelError:
+ return MessageColorError + message + AnsiReset
+ case LevelSuccess:
+ return MessageColorSuccess + message + AnsiReset
+ default:
+ return MessageColorInfo + message + AnsiReset
+ }
+}
+
+func buildFullMessage(level LogLevel, prefix string, message any) string {
+ return formatPrefix(prefix) + colorizeMessage(level, fmt.Sprint(message))
+}
diff --git a/nexus/utils/logger/logger.go b/nexus/utils/logger/logger.go new file mode 100644 index 0000000..f1cbbd1 --- /dev/null +++ b/nexus/utils/logger/logger.go @@ -0,0 +1,81 @@ +package logger
+
+import (
+ "fmt"
+ "os"
+
+ "go.uber.org/zap"
+ "go.uber.org/zap/zapcore"
+)
+
+var (
+ instance *zap.Logger
+ atomicLevel zap.AtomicLevel
+)
+
+func init() {
+ atomicLevel = zap.NewAtomicLevelAt(zapcore.InfoLevel)
+
+ encoderConfig := zapcore.EncoderConfig{
+ LevelKey: "level",
+ MessageKey: "msg",
+ LineEnding: "\n",
+ EncodeLevel: formatLevel,
+ }
+
+ encoder := zapcore.NewConsoleEncoder(encoderConfig)
+ stdoutSink := zapcore.AddSync(os.Stdout)
+ stderrSink := zapcore.AddSync(os.Stderr)
+
+ core := zapcore.NewTee(
+ zapcore.NewCore(encoder, stdoutSink, zap.LevelEnablerFunc(func(level zapcore.Level) bool {
+ return level < zapcore.WarnLevel && atomicLevel.Enabled(level)
+ })),
+ zapcore.NewCore(encoder, stderrSink, zap.LevelEnablerFunc(func(level zapcore.Level) bool {
+ return level >= zapcore.WarnLevel && atomicLevel.Enabled(level)
+ })),
+ )
+
+ instance = zap.New(core, zap.AddCaller())
+}
+
+func SetDebug(enabled bool) {
+ if enabled {
+ atomicLevel.SetLevel(zapcore.DebugLevel)
+ } else {
+ atomicLevel.SetLevel(zapcore.InfoLevel)
+ }
+}
+
+func Debugf(prefix string, format string, arguments ...any) {
+ emit(LevelDebug, zapcore.DebugLevel, prefix, fmt.Sprintf(format, arguments...))
+}
+
+func Infof(prefix string, format string, arguments ...any) {
+ emit(LevelInfo, zapcore.InfoLevel, prefix, fmt.Sprintf(format, arguments...))
+}
+
+func Successf(prefix string, format string, arguments ...any) {
+ emit(LevelSuccess, zapcore.InfoLevel, prefix, fmt.Sprintf(format, arguments...))
+}
+
+func Warnf(prefix string, format string, arguments ...any) {
+ emit(LevelWarn, zapcore.WarnLevel, prefix, fmt.Sprintf(format, arguments...))
+}
+
+func Errorf(prefix string, format string, arguments ...any) {
+ emit(LevelError, zapcore.ErrorLevel, prefix, fmt.Sprintf(format, arguments...))
+}
+
+func Fatalf(prefix string, format string, arguments ...any) {
+ emit(LevelError, zapcore.ErrorLevel, prefix, fmt.Sprintf(format, arguments...))
+ os.Exit(1)
+}
+
+func emit(levelLabel LogLevel, zapLevel zapcore.Level, prefix string, message any) {
+ if instance == nil {
+ panic(NotInitialized)
+ }
+
+ instance.Log(zapLevel, buildFullMessage(levelLabel, prefix, message))
+}
diff --git a/nexus/utils/logger/messages.go b/nexus/utils/logger/messages.go new file mode 100644 index 0000000..784cc43 --- /dev/null +++ b/nexus/utils/logger/messages.go @@ -0,0 +1,5 @@ +package logger
+
+const (
+ NotInitialized = "Logger was not initialized."
+)
|
