From 088ba3337d73d7819fed99d9d8a025fb77a9bcea Mon Sep 17 00:00:00 2001 From: Ivan Date: Fri, 7 Nov 2025 12:41:14 -0600 Subject: [PATCH] Add debug package for logging with adjustable levels - Introduced a new debug package that allows for logging at various levels (1-7). - Implemented initialization, logger retrieval, and logging functions. - Added functionality to set and get the current debug level. --- pkg/debug/debug.go | 112 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 pkg/debug/debug.go diff --git a/pkg/debug/debug.go b/pkg/debug/debug.go new file mode 100644 index 0000000..e4b06df --- /dev/null +++ b/pkg/debug/debug.go @@ -0,0 +1,112 @@ +package debug + +import ( + "flag" + "fmt" + "log/slog" + "os" +) + +const ( + DEBUG_CRITICAL = 1 + DEBUG_ERROR = 2 + DEBUG_INFO = 3 + DEBUG_VERBOSE = 4 + DEBUG_TRACE = 5 + DEBUG_PACKETS = 6 + DEBUG_ALL = 7 +) + +var ( + debugLevel = flag.Int("debug", 3, "debug level (1-7)") + logger *slog.Logger + initialized bool +) + +func Init() { + if initialized { + return + } + initialized = true + + var level slog.Level + switch { + case *debugLevel >= DEBUG_ALL: + level = slog.LevelDebug + case *debugLevel >= DEBUG_PACKETS: + level = slog.LevelDebug + case *debugLevel >= DEBUG_TRACE: + level = slog.LevelDebug + case *debugLevel >= DEBUG_VERBOSE: + level = slog.LevelDebug + case *debugLevel >= DEBUG_INFO: + level = slog.LevelInfo + case *debugLevel >= DEBUG_ERROR: + level = slog.LevelWarn + case *debugLevel >= DEBUG_CRITICAL: + level = slog.LevelError + default: + level = slog.LevelError + } + + opts := &slog.HandlerOptions{ + Level: level, + } + logger = slog.New(slog.NewTextHandler(os.Stderr, opts)) + slog.SetDefault(logger) +} + +func GetLogger() *slog.Logger { + if !initialized { + Init() + } + return logger +} + +func Log(level int, msg string, args ...interface{}) { + if !initialized { + Init() + } + + if *debugLevel < level { + return + } + + var slogLevel slog.Level + switch { + case level >= DEBUG_ALL: + slogLevel = slog.LevelDebug + case level >= DEBUG_PACKETS: + slogLevel = slog.LevelDebug + case level >= DEBUG_TRACE: + slogLevel = slog.LevelDebug + case level >= DEBUG_VERBOSE: + slogLevel = slog.LevelDebug + case level >= DEBUG_INFO: + slogLevel = slog.LevelInfo + case level >= DEBUG_ERROR: + slogLevel = slog.LevelWarn + case level >= DEBUG_CRITICAL: + slogLevel = slog.LevelError + default: + slogLevel = slog.LevelError + } + + if !logger.Enabled(nil, slogLevel) { + return + } + + logger.Log(nil, slogLevel, fmt.Sprintf(msg, args...), "debug_level", level) +} + +func SetDebugLevel(level int) { + *debugLevel = level + if initialized { + Init() + } +} + +func GetDebugLevel() int { + return *debugLevel +} +