70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
package logging
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
"os"
|
|
)
|
|
|
|
var Logger *slog.Logger
|
|
|
|
type MultiHandler struct {
|
|
handlers []slog.Handler
|
|
}
|
|
|
|
func (m *MultiHandler) Enabled(ctx context.Context, level slog.Level) bool {
|
|
for _, h := range m.handlers {
|
|
if h.Enabled(ctx, level) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (m *MultiHandler) Handle(ctx context.Context, record slog.Record) error {
|
|
for _, h := range m.handlers {
|
|
_ = h.Handle(ctx, record)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (m *MultiHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
|
|
newHandlers := make([]slog.Handler, len(m.handlers))
|
|
for i, h := range m.handlers {
|
|
newHandlers[i] = h.WithAttrs(attrs)
|
|
}
|
|
return &MultiHandler{handlers: newHandlers}
|
|
}
|
|
|
|
func (m *MultiHandler) WithGroup(name string) slog.Handler {
|
|
newHandlers := make([]slog.Handler, len(m.handlers))
|
|
for i, h := range m.handlers {
|
|
newHandlers[i] = h.WithGroup(name)
|
|
}
|
|
return &MultiHandler{handlers: newHandlers}
|
|
}
|
|
|
|
func InitLogger() {
|
|
logFile, err := os.OpenFile("../angel_api-server.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
|
if err != nil {
|
|
slog.Default().Error("Error opening log file", "error", err)
|
|
return
|
|
}
|
|
|
|
fileHandler := slog.NewJSONHandler(logFile, &slog.HandlerOptions{Level: slog.LevelDebug})
|
|
consoleHandler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug})
|
|
|
|
multiHandler := &MultiHandler{handlers: []slog.Handler{fileHandler, consoleHandler}}
|
|
|
|
Logger = slog.New(multiHandler)
|
|
|
|
slog.SetDefault(Logger)
|
|
}
|
|
|
|
func GetLogger() *slog.Logger {
|
|
if Logger == nil {
|
|
InitLogger()
|
|
}
|
|
return Logger
|
|
}
|