package logging import ( "log/slog" "os" "github.com/lmittmann/tint" ) // ---------- Standard log handling (terminal or file based) ---------- var logLevel slog.LevelVar var fileLogger *os.File // Set the logging to a particular level, quietly func SetLevel(level slog.Level) { logLevel.Set(level) } // Enable debug level logging func EnableDebug() { if logLevel.Level() > slog.LevelDebug { logLevel.Set(slog.LevelDebug) slog.Debug("Debug logging enabled") } } func LogToFile(logfile string) error { if fileLogger != nil { (*fileLogger).Close() } // Open the log file var err error fileLogger, err = os.OpenFile(logfile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o600) if err != nil { return err } opts := &slog.HandlerOptions{ Level: &logLevel, } handler := slog.NewJSONHandler(fileLogger, opts) logger := slog.New(handler) slog.SetDefault(logger) return nil } func Shutdown() error { var err error = nil if fileLogger != nil { err = (*fileLogger).Close() fileLogger = nil } return err } func LogToTerminal() { opts := &tint.Options{ Level: &logLevel, TimeFormat: "*", } handler := tint.NewTextHandler(os.Stdout, opts) logger := slog.New(handler) slog.SetDefault(logger) } // IsJSONHandler reports whether h writes JSON, as the file logger does. func IsJSONHandler(h slog.Handler) bool { _, ok := h.(*slog.JSONHandler) return ok } func IsFileLogger() bool { return fileLogger != nil } func IsDebugEnabled() bool { return logLevel.Level() <= slog.LevelDebug }