Nik Afiq dc0476eead
All checks were successful
CI / test (push) Successful in 5s
CI / build-ha-gateway (push) Successful in 59s
CI / build-discord-bot (push) Successful in 59s
feat: implement structured logging and enhance error handling in HA client and gRPC server
2026-04-07 22:32:29 +09:00

36 lines
806 B
Go

package logger
import (
"context"
"fmt"
"log/slog"
"os"
)
type contextKey struct{}
func New(format, level string) *slog.Logger {
var parsed slog.Level
if err := parsed.UnmarshalText([]byte(level)); err != nil {
_, _ = fmt.Fprintf(os.Stderr, "invalid log level %q, falling back to info\n", level)
parsed = slog.LevelInfo
}
opts := &slog.HandlerOptions{Level: parsed}
if format == "json" {
return slog.New(slog.NewJSONHandler(os.Stdout, opts))
}
return slog.New(slog.NewTextHandler(os.Stdout, opts))
}
func WithLogger(ctx context.Context, l *slog.Logger) context.Context {
return context.WithValue(ctx, contextKey{}, l)
}
func FromContext(ctx context.Context) *slog.Logger {
if l, ok := ctx.Value(contextKey{}).(*slog.Logger); ok && l != nil {
return l
}
return slog.Default()
}