diff options
| -rw-r--r-- | cmd/client/client.go | 8 | ||||
| -rw-r--r-- | cmd/server/server.go | 14 | ||||
| -rw-r--r-- | internal/utils/log.go | 44 | ||||
| -rw-r--r-- | internal/utils/log/level.go | 25 | ||||
| -rw-r--r-- | internal/utils/log/log.go | 26 | ||||
| -rw-r--r-- | internal/utils/log/logger.go | 55 |
6 files changed, 117 insertions, 55 deletions
diff --git a/cmd/client/client.go b/cmd/client/client.go index 9554090..120dc61 100644 --- a/cmd/client/client.go +++ b/cmd/client/client.go @@ -1,12 +1,12 @@ package main import ( - "log/slog" + "os" - "github.com/kyren223/eko/internal/utils" + "github.com/kyren223/eko/internal/utils/log" ) func main() { - utils.SetupLogger("Client") - slog.Info("Eko 'Hello, World!'") + log.SetDefault(log.NewLogger("Client", os.Stdout, true)) + log.Info("Eko 'Hello, World!'") } diff --git a/cmd/server/server.go b/cmd/server/server.go index 4ba6978..a1dee90 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -1,15 +1,15 @@ package main import ( - "log/slog" + "os" - "github.com/kyren223/eko/internal/utils" + "github.com/kyren223/eko/internal/utils/log" ) func main() { - utils.SetupLogger("Server") - slog.Debug("Eko 'Hello, World!'") - slog.Info("Eko 'Hello, World!'") - slog.Warn("Eko 'Hello, World!'") - slog.Error("Eko 'Hello, World!'") + log.SetDefault(log.NewLogger("Server", os.Stdout, true)) + log.Debug("Eko 'Hello, World!'") + log.Info("Eko 'Hello, World!'") + log.Warn("Eko 'Hello, World!'") + log.Error("Eko 'Hello, World!'") } diff --git a/internal/utils/log.go b/internal/utils/log.go deleted file mode 100644 index 3548bd3..0000000 --- a/internal/utils/log.go +++ /dev/null @@ -1,44 +0,0 @@ -package utils - -import ( - "context" - "fmt" - "io" - "log" - "log/slog" - "os" - "time" -) - -func SetupLogger(name string) { - logger := slog.New(CustomHandler{os.Stdout, name, nil}) - slog.SetDefault(logger) - slog.SetLogLoggerLevel() -} - -type CustomHandler struct { - writer io.Writer - group string - attrs []slog.Attr -} - -func (h CustomHandler) Handle(ctx context.Context, r slog.Record) error { - // timestamp := time.Now().Format(time.RFC3339Nano) - timestamp := time.Now().Format(time.TimeOnly) - severity := r.Level.String() - _, err := fmt.Fprintf(h.writer, "[%s] [%s/%s]: %s\n", timestamp, h.group, severity, r.Message) - return err -} - -func (h CustomHandler) Enabled(ctx context.Context, level slog.Level) bool { - slog.Handler - return true -} - -func (h CustomHandler) WithAttrs(attrs []slog.Attr) slog.Handler { - return &CustomHandler{h.writer, h.group, append(h.attrs, attrs...)} -} - -func (h CustomHandler) WithGroup(name string) slog.Handler { - return &CustomHandler{h.writer, name, h.attrs} -} diff --git a/internal/utils/log/level.go b/internal/utils/log/level.go new file mode 100644 index 0000000..7b68b0c --- /dev/null +++ b/internal/utils/log/level.go @@ -0,0 +1,25 @@ +package log + +type Level int + +func (l Level) String() string { + switch l { + case LevelDebug: + return "DEBUG" + case LevelInfo: + return "INFO" + case LevelWarn: + return "WARN" + case LevelError: + return "ERROR" + default: + return "" + } +} + +const ( + LevelDebug Level = -4 + LevelInfo Level = 0 + LevelWarn Level = 4 + LevelError Level = 8 +) diff --git a/internal/utils/log/log.go b/internal/utils/log/log.go new file mode 100644 index 0000000..724b074 --- /dev/null +++ b/internal/utils/log/log.go @@ -0,0 +1,26 @@ +package log + +var ( + level Level + logger *Logger +) + +func SetDefault(l *Logger) { + logger = l +} + +func Debug(message string, a ...any) error { + return logger.Log(LevelDebug, message, a) +} + +func Info(message string, a ...any) error { + return logger.Log(LevelInfo, message, a) +} + +func Warn(message string, a ...any) error { + return logger.Log(LevelWarn, message, a) +} + +func Error(message string, a ...any) error { + return logger.Log(LevelError, message, a) +} diff --git a/internal/utils/log/logger.go b/internal/utils/log/logger.go new file mode 100644 index 0000000..735cb9e --- /dev/null +++ b/internal/utils/log/logger.go @@ -0,0 +1,55 @@ +package log + +import ( + "fmt" + "go/format" + "io" + "os" + "sync" + "time" +) + +type Logger struct { + name string + Level + writer io.Writer + mu sync.Mutex + color bool +} + +func NewLogger(name string, writer io.Writer, ansi bool) *Logger { + color := ansi && (writer == os.Stdout || writer == os.Stderr) + return &Logger{name, LevelInfo, writer, sync.Mutex{}, color} +} + +func (l *Logger) Log(level Level, message string, a ...any) error { + if l.Level > level { + return nil + } + + timestamp := time.Now().Format(time.TimeOnly) + severity := level.String() + + // TODO: add support for ANSI coloring + l.mu.Lock() + _, err := fmt.Fprintf(l.writer, "[%s] [%s/%s]: %s\n", timestamp, l.name, severity, message, a) + l.mu.Unlock() + return err +} + +func (l *Logger) Debug(message string, a ...any) error { + return l.Log(LevelDebug, message, a) +} + +func (l *Logger) Info(message string, a ...any) error { + return l.Log(LevelInfo, message, a) +} + +func (l *Logger) Warn(message string, a ...any) error { + return l.Log(LevelWarn, message, a) +} + +func (l *Logger) Error(message string, a ...any) error { + return l.Log(LevelError, message, a) +} + |
