diff options
Diffstat (limited to 'modules/log/level.go')
-rw-r--r-- | modules/log/level.go | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/modules/log/level.go b/modules/log/level.go new file mode 100644 index 0000000000..6131fcb510 --- /dev/null +++ b/modules/log/level.go @@ -0,0 +1,111 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package log + +import ( + "bytes" + "encoding/json" + "fmt" + "os" + "strings" +) + +// Level is the level of the logger +type Level int + +const ( + // TRACE represents the lowest log level + TRACE Level = iota + // DEBUG is for debug logging + DEBUG + // INFO is for information + INFO + // WARN is for warning information + WARN + // ERROR is for error reporting + ERROR + // CRITICAL is for critical errors + CRITICAL + // FATAL is for fatal errors + FATAL + // NONE is for no logging + NONE +) + +var toString = map[Level]string{ + TRACE: "trace", + DEBUG: "debug", + INFO: "info", + WARN: "warn", + ERROR: "error", + CRITICAL: "critical", + FATAL: "fatal", + NONE: "none", +} + +var toLevel = map[string]Level{ + "trace": TRACE, + "debug": DEBUG, + "info": INFO, + "warn": WARN, + "error": ERROR, + "critical": CRITICAL, + "fatal": FATAL, + "none": NONE, +} + +// Levels returns all the possible logging levels +func Levels() []string { + keys := make([]string, 0) + for key := range toLevel { + keys = append(keys, key) + } + return keys +} + +func (l Level) String() string { + s, ok := toString[l] + if ok { + return s + } + return "info" +} + +// MarshalJSON takes a Level and turns it into text +func (l Level) MarshalJSON() ([]byte, error) { + buffer := bytes.NewBufferString(`"`) + buffer.WriteString(toString[l]) + buffer.WriteString(`"`) + return buffer.Bytes(), nil +} + +// FromString takes a level string and returns a Level +func FromString(level string) Level { + temp, ok := toLevel[strings.ToLower(level)] + if !ok { + return INFO + } + return temp +} + +// UnmarshalJSON takes text and turns it into a Level +func (l *Level) UnmarshalJSON(b []byte) error { + var tmp interface{} + err := json.Unmarshal(b, &tmp) + if err != nil { + fmt.Fprintf(os.Stderr, "Err: %v", err) + return err + } + + switch v := tmp.(type) { + case string: + *l = FromString(string(v)) + case int: + *l = FromString(Level(v).String()) + default: + *l = INFO + } + return nil +} |