Skip to content

Commit bb9e884

Browse files
committed
Custom logger
1 parent 8712089 commit bb9e884

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

internal/Logger.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package internal
2+
3+
import (
4+
"context"
5+
"log/slog"
6+
"os"
7+
"strconv"
8+
"strings"
9+
)
10+
11+
var Logger = initLogger()
12+
var LogLevel = slog.LevelInfo
13+
14+
// level=Trace is for stuff that should not be logged in production, either because it's too verbose or because it contains sensitive information.
15+
16+
func initLogger() *LoggerWithTrace {
17+
18+
logLevel := os.Getenv("LOG_LEVEL")
19+
var err error
20+
if logLevel != "" {
21+
ilvl, atoiErr := strconv.Atoi(logLevel)
22+
if atoiErr == nil {
23+
LogLevel = slog.Level(ilvl)
24+
} else if strings.ToLower(logLevel) == "trace" {
25+
LogLevel = -8
26+
} else {
27+
err = LogLevel.UnmarshalText([]byte(logLevel))
28+
if err != nil {
29+
LogLevel = slog.LevelInfo
30+
}
31+
}
32+
}
33+
34+
// get log format from the environment
35+
logFormat := os.Getenv("LOG_FORMAT")
36+
var handler slog.Handler
37+
switch logFormat {
38+
case "json":
39+
handler = slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{
40+
Level: LogLevel,
41+
AddSource: true,
42+
})
43+
default:
44+
handler = slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
45+
Level: LogLevel,
46+
AddSource: true,
47+
})
48+
}
49+
50+
logger := slog.New(handler)
51+
slog.SetDefault(logger)
52+
53+
if err != nil {
54+
slog.Error("unable to set log level", "level", LogLevel, "error", err)
55+
} else {
56+
slog.Debug("log level set", "level", LogLevel)
57+
}
58+
59+
return &LoggerWithTrace{Logger: logger}
60+
}
61+
62+
// LoggerWithTrace is a wrapper around slog.Logger that adds a Trace method.
63+
type LoggerWithTrace struct {
64+
*slog.Logger
65+
}
66+
67+
// Trace logs a message at the trace level.
68+
func (l *LoggerWithTrace) Trace(msg string, keyvals ...interface{}) {
69+
l.Log(context.Background(), slog.Level(-8), msg, keyvals...)
70+
}
71+
72+
// WithTrace returns the LoggerWithTrace instance.
73+
func (l *LoggerWithTrace) WithTrace() *LoggerWithTrace {
74+
return l
75+
}

0 commit comments

Comments
 (0)