github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/pkg/logger/level.go (about)

     1  package logger
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  )
     8  
     9  // Level type
    10  type Level uint8
    11  
    12  // These are the different logging levels.
    13  const (
    14  	// levelUnknown represent an unparsable level
    15  	levelUnknown Level = iota
    16  
    17  	// ErrorLevel logs important errors when failure append.
    18  	ErrorLevel
    19  
    20  	// WarnLevel logs non critical entries that deserve some intention.
    21  	WarnLevel
    22  
    23  	// InfoLevel log general operational entries about what's going on inside
    24  	// the application.
    25  	InfoLevel
    26  
    27  	// DebugLevel logs is only enabled when debugging is setup. It can be
    28  	// very verbose logging and should be activated only on a limited period.
    29  	DebugLevel
    30  )
    31  
    32  var (
    33  	ErrInvalidLevel = errors.New("not a valid logging Level")
    34  )
    35  
    36  // String converts the Level to a string. E.g. LevelDebug becomes "debug".
    37  func (level Level) String() string {
    38  	if b, err := level.MarshalText(); err == nil {
    39  		return string(b)
    40  	}
    41  
    42  	return "unknown"
    43  }
    44  
    45  // ParseLevel takes a string level and returns the log level constant.
    46  func ParseLevel(lvl string) (Level, error) {
    47  	switch strings.ToLower(lvl) {
    48  	case "error":
    49  		return ErrorLevel, nil
    50  	case "warn", "warning":
    51  		return WarnLevel, nil
    52  	case "info":
    53  		return InfoLevel, nil
    54  	case "debug":
    55  		return DebugLevel, nil
    56  	}
    57  
    58  	return levelUnknown, fmt.Errorf("%q: %w", lvl, ErrInvalidLevel)
    59  }
    60  
    61  // UnmarshalText implements encoding.TextUnmarshaler.
    62  func (level *Level) UnmarshalText(text []byte) error {
    63  	l, err := ParseLevel(string(text))
    64  	if err != nil {
    65  		return err
    66  	}
    67  
    68  	*level = l
    69  
    70  	return nil
    71  }
    72  
    73  // MarshalText implements encoding.TextMarshaler.
    74  func (level Level) MarshalText() ([]byte, error) {
    75  	switch level {
    76  	case DebugLevel:
    77  		return []byte("debug"), nil
    78  	case InfoLevel:
    79  		return []byte("info"), nil
    80  	case WarnLevel:
    81  		return []byte("warning"), nil
    82  	case ErrorLevel:
    83  		return []byte("error"), nil
    84  	}
    85  
    86  	return nil, fmt.Errorf("not a valid logging level %d", level)
    87  }