github.com/jd-ly/cmd@v1.0.10/logger/utils.go (about) 1 package logger 2 3 import ( 4 "github.com/revel/log15" 5 "gopkg.in/stack.v0" 6 "log" 7 ) 8 9 // Utility package to make existing logging backwards compatible 10 var ( 11 // Convert the string to LogLevel 12 toLevel = map[string]LogLevel{"debug": LogLevel(log15.LvlDebug), 13 "info": LogLevel(log15.LvlInfo), "request": LogLevel(log15.LvlInfo), "warn": LogLevel(log15.LvlWarn), 14 "error": LogLevel(log15.LvlError), "crit": LogLevel(log15.LvlCrit), 15 "trace": LogLevel(log15.LvlDebug), // TODO trace is deprecated, replaced by debug 16 } 17 ) 18 19 const ( 20 // The test mode flag overrides the default log level and shows only errors 21 TEST_MODE_FLAG = "testModeFlag" 22 // The special use flag enables showing messages when the logger is setup 23 SPECIAL_USE_FLAG = "specialUseFlag" 24 ) 25 26 // Returns the logger for the name 27 func GetLogger(name string, logger MultiLogger) (l *log.Logger) { 28 switch name { 29 case "trace": // TODO trace is deprecated, replaced by debug 30 l = log.New(loggerRewrite{Logger: logger, Level: log15.LvlDebug}, "", 0) 31 case "debug": 32 l = log.New(loggerRewrite{Logger: logger, Level: log15.LvlDebug}, "", 0) 33 case "info": 34 l = log.New(loggerRewrite{Logger: logger, Level: log15.LvlInfo}, "", 0) 35 case "warn": 36 l = log.New(loggerRewrite{Logger: logger, Level: log15.LvlWarn}, "", 0) 37 case "error": 38 l = log.New(loggerRewrite{Logger: logger, Level: log15.LvlError}, "", 0) 39 case "request": 40 l = log.New(loggerRewrite{Logger: logger, Level: log15.LvlInfo}, "", 0) 41 } 42 43 return l 44 45 } 46 47 // Used by the initFilterLog to handle the filters 48 var logFilterList = []struct { 49 LogPrefix, LogSuffix string 50 parentHandler func(map[string]interface{}) ParentLogHandler 51 }{{ 52 "log.", ".filter", 53 func(keyMap map[string]interface{}) ParentLogHandler { 54 return NewParentLogHandler(func(child LogHandler) LogHandler { 55 return MatchMapHandler(keyMap, child) 56 }) 57 58 }, 59 }, { 60 "log.", ".nfilter", 61 func(keyMap map[string]interface{}) ParentLogHandler { 62 return NewParentLogHandler(func(child LogHandler) LogHandler { 63 return NotMatchMapHandler(keyMap, child) 64 }) 65 }, 66 }} 67 68 // This structure and method will handle the old output format and log it to the new format 69 type loggerRewrite struct { 70 Logger MultiLogger 71 Level log15.Lvl 72 hideDeprecated bool 73 } 74 75 // The message indicating that a logger is using a deprecated log mechanism 76 var log_deprecated = []byte("* LOG DEPRECATED * ") 77 78 // Implements the Write of the logger 79 func (lr loggerRewrite) Write(p []byte) (n int, err error) { 80 if !lr.hideDeprecated { 81 p = append(log_deprecated, p...) 82 } 83 n = len(p) 84 if len(p) > 0 && p[n-1] == '\n' { 85 p = p[:n-1] 86 n-- 87 } 88 89 switch lr.Level { 90 case log15.LvlInfo: 91 lr.Logger.Info(string(p)) 92 case log15.LvlDebug: 93 lr.Logger.Debug(string(p)) 94 case log15.LvlWarn: 95 lr.Logger.Warn(string(p)) 96 case log15.LvlError: 97 lr.Logger.Error(string(p)) 98 case log15.LvlCrit: 99 lr.Logger.Crit(string(p)) 100 } 101 102 return 103 } 104 105 // For logging purposes the call stack can be used to record the stack trace of a bad error 106 // simply pass it as a context field in your log statement like 107 // `controller.Log.Crit("This should not occur","stack",revel.NewCallStack())` 108 func NewCallStack() interface{} { 109 return stack.Trace() 110 }