From b3539a32ab733e2f3bfc87c85545582548d9cfaf Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Tue, 6 May 2025 22:59:54 +0300 Subject: [PATCH] logger: add none level closes #399 Signed-off-by: Vasiliy Tolstov --- logger/level.go | 18 ++++++++++++------ logger/slog/slog.go | 7 +++++++ logger/slog/slog_test.go | 18 ++++++++++++++++++ 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/logger/level.go b/logger/level.go index c51f4173..92832f29 100644 --- a/logger/level.go +++ b/logger/level.go @@ -4,18 +4,20 @@ package logger type Level int8 const ( - // TraceLevel level usually used to find bugs, very verbose + // TraceLevel usually used to find bugs, very verbose TraceLevel Level = iota - 2 - // DebugLevel level used only when enabled debugging + // DebugLevel used only when enabled debugging DebugLevel - // InfoLevel level used for general info about what's going on inside the application + // InfoLevel used for general info about what's going on inside the application InfoLevel - // WarnLevel level used for non-critical entries + // WarnLevel used for non-critical entries WarnLevel - // ErrorLevel level used for errors that should definitely be noted + // ErrorLevel used for errors that should definitely be noted ErrorLevel - // FatalLevel level used for critical errors and then calls `os.Exit(1)` + // FatalLevel used for critical errors and then calls `os.Exit(1)` FatalLevel + // NoneLevel used to disable logging + NoneLevel ) // String returns logger level string representation @@ -33,6 +35,8 @@ func (l Level) String() string { return "error" case FatalLevel: return "fatal" + case NoneLevel: + return "none" } return "info" } @@ -58,6 +62,8 @@ func ParseLevel(lvl string) Level { return ErrorLevel case FatalLevel.String(): return FatalLevel + case NoneLevel.String(): + return NoneLevel } return InfoLevel } diff --git a/logger/slog/slog.go b/logger/slog/slog.go index 949b868d..d38397f2 100644 --- a/logger/slog/slog.go +++ b/logger/slog/slog.go @@ -34,6 +34,7 @@ var ( warnValue = slog.StringValue("warn") errorValue = slog.StringValue("error") fatalValue = slog.StringValue("fatal") + noneValue = slog.StringValue("none") ) type wrapper struct { @@ -85,6 +86,8 @@ func (s *slogLogger) renameAttr(_ []string, a slog.Attr) slog.Attr { a.Value = errorValue case lvl >= logger.FatalLevel: a.Value = fatalValue + case lvl >= logger.NoneLevel: + a.Value = noneValue default: a.Value = infoValue } @@ -316,6 +319,8 @@ func loggerToSlogLevel(level logger.Level) slog.Level { return slog.LevelDebug - 1 case logger.FatalLevel: return slog.LevelError + 1 + case logger.NoneLevel: + return slog.LevelError + 2 default: return slog.LevelInfo } @@ -333,6 +338,8 @@ func slogToLoggerLevel(level slog.Level) logger.Level { return logger.TraceLevel case slog.LevelError + 1: return logger.FatalLevel + case slog.LevelError + 2: + return logger.NoneLevel default: return logger.InfoLevel } diff --git a/logger/slog/slog_test.go b/logger/slog/slog_test.go index 2beaa95f..f6d46393 100644 --- a/logger/slog/slog_test.go +++ b/logger/slog/slog_test.go @@ -36,6 +36,24 @@ func TestStacktrace(t *testing.T) { } } +func TestNoneLevel(t *testing.T) { + ctx := context.TODO() + buf := bytes.NewBuffer(nil) + l := NewLogger(logger.WithLevel(logger.NoneLevel), logger.WithOutput(buf), + WithHandlerFunc(slog.NewTextHandler), + logger.WithAddStacktrace(true), + ) + if err := l.Init(logger.WithFields("key1", "val1")); err != nil { + t.Fatal(err) + } + + l.Error(ctx, "msg1", errors.New("err")) + + if buf.Len() != 0 { + t.Fatalf("logger none level not works, buf contains: %s", buf.Bytes()) + } +} + func TestDelayedBuffer(t *testing.T) { ctx := context.TODO() buf := bytes.NewBuffer(nil)