code.gitea.io/gitea@v1.19.3/modules/log/level.go (about)

     1  // Copyright 2019 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package log
     5  
     6  import (
     7  	"bytes"
     8  	"fmt"
     9  	"os"
    10  	"strings"
    11  
    12  	"code.gitea.io/gitea/modules/json"
    13  )
    14  
    15  // Level is the level of the logger
    16  type Level int
    17  
    18  const (
    19  	// TRACE represents the lowest log level
    20  	TRACE Level = iota
    21  	// DEBUG is for debug logging
    22  	DEBUG
    23  	// INFO is for information
    24  	INFO
    25  	// WARN is for warning information
    26  	WARN
    27  	// ERROR is for error reporting
    28  	ERROR
    29  	// CRITICAL is for critical errors
    30  	CRITICAL
    31  	// FATAL is for fatal errors
    32  	FATAL
    33  	// NONE is for no logging
    34  	NONE
    35  )
    36  
    37  var toString = map[Level]string{
    38  	TRACE:    "trace",
    39  	DEBUG:    "debug",
    40  	INFO:     "info",
    41  	WARN:     "warn",
    42  	ERROR:    "error",
    43  	CRITICAL: "critical",
    44  	FATAL:    "fatal",
    45  	NONE:     "none",
    46  }
    47  
    48  var toLevel = map[string]Level{
    49  	"trace":    TRACE,
    50  	"debug":    DEBUG,
    51  	"info":     INFO,
    52  	"warn":     WARN,
    53  	"error":    ERROR,
    54  	"critical": CRITICAL,
    55  	"fatal":    FATAL,
    56  	"none":     NONE,
    57  }
    58  
    59  // Levels returns all the possible logging levels
    60  func Levels() []string {
    61  	keys := make([]string, 0)
    62  	for key := range toLevel {
    63  		keys = append(keys, key)
    64  	}
    65  	return keys
    66  }
    67  
    68  func (l Level) String() string {
    69  	s, ok := toString[l]
    70  	if ok {
    71  		return s
    72  	}
    73  	return "info"
    74  }
    75  
    76  // Color returns the color string for this Level
    77  func (l Level) Color() *[]byte {
    78  	color, ok := levelToColor[l]
    79  	if ok {
    80  		return &(color)
    81  	}
    82  	none := levelToColor[NONE]
    83  	return &none
    84  }
    85  
    86  // MarshalJSON takes a Level and turns it into text
    87  func (l Level) MarshalJSON() ([]byte, error) {
    88  	buffer := bytes.NewBufferString(`"`)
    89  	buffer.WriteString(toString[l])
    90  	buffer.WriteString(`"`)
    91  	return buffer.Bytes(), nil
    92  }
    93  
    94  // FromString takes a level string and returns a Level
    95  func FromString(level string) Level {
    96  	temp, ok := toLevel[strings.ToLower(level)]
    97  	if !ok {
    98  		return INFO
    99  	}
   100  	return temp
   101  }
   102  
   103  // UnmarshalJSON takes text and turns it into a Level
   104  func (l *Level) UnmarshalJSON(b []byte) error {
   105  	var tmp interface{}
   106  	err := json.Unmarshal(b, &tmp)
   107  	if err != nil {
   108  		fmt.Fprintf(os.Stderr, "Err: %v", err)
   109  		return err
   110  	}
   111  
   112  	switch v := tmp.(type) {
   113  	case string:
   114  		*l = FromString(v)
   115  	case int:
   116  		*l = FromString(Level(v).String())
   117  	default:
   118  		*l = INFO
   119  	}
   120  	return nil
   121  }