code.gitea.io/gitea@v1.22.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 "strings" 9 10 "code.gitea.io/gitea/modules/json" 11 ) 12 13 // Level is the level of the logger 14 type Level int 15 16 const ( 17 UNDEFINED Level = iota 18 TRACE 19 DEBUG 20 INFO 21 WARN 22 ERROR 23 FATAL 24 NONE 25 ) 26 27 const CRITICAL = ERROR // most logger frameworks doesn't support CRITICAL, and it doesn't seem useful 28 29 var toString = map[Level]string{ 30 UNDEFINED: "undefined", 31 32 TRACE: "trace", 33 DEBUG: "debug", 34 INFO: "info", 35 WARN: "warn", 36 ERROR: "error", 37 38 FATAL: "fatal", 39 NONE: "none", 40 } 41 42 var toLevel = map[string]Level{ 43 "undefined": UNDEFINED, 44 45 "trace": TRACE, 46 "debug": DEBUG, 47 "info": INFO, 48 "warn": WARN, 49 "warning": WARN, 50 "error": ERROR, 51 52 "fatal": FATAL, 53 "none": NONE, 54 } 55 56 var levelToColor = map[Level][]ColorAttribute{ 57 TRACE: {Bold, FgCyan}, 58 DEBUG: {Bold, FgBlue}, 59 INFO: {Bold, FgGreen}, 60 WARN: {Bold, FgYellow}, 61 ERROR: {Bold, FgRed}, 62 FATAL: {Bold, BgRed}, 63 NONE: {Reset}, 64 } 65 66 func (l Level) String() string { 67 s, ok := toString[l] 68 if ok { 69 return s 70 } 71 return "info" 72 } 73 74 func (l Level) ColorAttributes() []ColorAttribute { 75 color, ok := levelToColor[l] 76 if ok { 77 return color 78 } 79 none := levelToColor[NONE] 80 return none 81 } 82 83 // MarshalJSON takes a Level and turns it into text 84 func (l Level) MarshalJSON() ([]byte, error) { 85 buffer := bytes.NewBufferString(`"`) 86 buffer.WriteString(toString[l]) 87 buffer.WriteString(`"`) 88 return buffer.Bytes(), nil 89 } 90 91 // UnmarshalJSON takes text and turns it into a Level 92 func (l *Level) UnmarshalJSON(b []byte) error { 93 var tmp any 94 err := json.Unmarshal(b, &tmp) 95 if err != nil { 96 return err 97 } 98 99 switch v := tmp.(type) { 100 case string: 101 *l = LevelFromString(v) 102 case int: 103 *l = LevelFromString(Level(v).String()) 104 default: 105 *l = INFO 106 } 107 return nil 108 } 109 110 // LevelFromString takes a level string and returns a Level 111 func LevelFromString(level string) Level { 112 if l, ok := toLevel[strings.ToLower(level)]; ok { 113 return l 114 } 115 return INFO 116 }