github.com/benchkram/bob@v0.0.0-20240314204020-b7a57f2f9be9/pkg/boblog/boblog.go (about) 1 package boblog 2 3 // rough logr.Logger implementation 4 // to be replaced with "logging"-branch 5 6 import ( 7 "errors" 8 "fmt" 9 "github.com/benchkram/bob/pkg/usererror" 10 "unicode" 11 12 "github.com/benchkram/errz" 13 "github.com/logrusorgru/aurora" 14 ) 15 16 var Log = log{level: 0} 17 18 var globalLogLevel = 1 19 20 func SetLogLevel(level int) { 21 if level < 0 { 22 level = 0 23 } 24 globalLogLevel = level 25 } 26 27 type log struct { 28 level int 29 } 30 31 func (l log) V(level int) log { 32 if level < 0 { 33 return l 34 } 35 36 l.level = l.level + level 37 return l 38 } 39 40 func (l log) Info(msg string) { 41 if l.level > globalLogLevel { 42 return 43 } 44 fmt.Println(msg) 45 } 46 47 func (l log) Error(err error, msg string, keysAndValues ...interface{}) { 48 // Only log if there's actually an error 49 if err == nil { 50 return 51 } 52 53 // Error message will always be logged if exists 54 fmt.Print(aurora.Red(msg + ": ")) 55 56 // Stack trace will only be logged if globalLogLevel >= 2 57 if globalLogLevel >= 2 { 58 errz.Log(err) 59 } else { 60 for { 61 er := errors.Unwrap(err) 62 if er == nil { 63 break 64 } 65 66 err = er 67 } 68 69 fmt.Println(aurora.Red(err)) 70 } 71 } 72 73 // UserError is intended to present errors to the user 74 // should go into a cli beatify package in the future.. 75 func (l log) UserError(err error) { 76 if err == nil { 77 return 78 } 79 80 var uerr *usererror.E 81 er := err 82 for { 83 if errors.As(er, &uerr) { 84 err = uerr 85 break 86 } 87 88 er = errors.Unwrap(er) 89 if er == nil { 90 break 91 } 92 } 93 94 msg := err.Error() 95 96 if msg != "" { 97 tmp := []rune(msg) 98 tmp[0] = unicode.ToUpper(tmp[0]) 99 msg = string(tmp) 100 } 101 102 fmt.Println(aurora.Red(msg)) 103 }