mirror of
https://github.com/Kyren223/eko.git
synced 2025-09-05 21:18:14 +00:00
feat: implement logging system
This commit is contained in:
@@ -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!'")
|
||||
}
|
||||
|
@@ -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!'")
|
||||
}
|
||||
|
@@ -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}
|
||||
}
|
25
internal/utils/log/level.go
Normal file
25
internal/utils/log/level.go
Normal 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
26
internal/utils/log/log.go
Normal 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)
|
||||
}
|
55
internal/utils/log/logger.go
Normal file
55
internal/utils/log/logger.go
Normal 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)
|
||||
}
|
||||
|
Reference in New Issue
Block a user