feat: implement logging system

This commit is contained in:
Kyren223
2024-10-05 01:16:29 +03:00
parent ddb2878cc2
commit 0929041a9c
6 changed files with 117 additions and 55 deletions

View File

@@ -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!'")
}

View File

@@ -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!'")
}

View File

@@ -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}
}

View File

@@ -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
)

26
internal/utils/log/log.go Normal file
View File

@@ -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)
}

View File

@@ -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)
}