github.com/jd-ly/cmd@v1.0.10/logger/logger.go (about) 1 package logger 2 3 import ( 4 "fmt" 5 "github.com/revel/config" 6 "time" 7 ) 8 9 // The LogHandler defines the interface to handle the log records 10 type ( 11 // The Multilogger reduces the number of exposed defined logging variables, 12 // and allows the output to be easily refined 13 MultiLogger interface { 14 // New returns a new Logger that has this logger's context plus the given context 15 New(ctx ...interface{}) MultiLogger 16 17 // SetHandler updates the logger to write records to the specified handler. 18 SetHandler(h LogHandler) 19 20 // Set the stack depth for the logger 21 SetStackDepth(int) MultiLogger 22 23 // Log a message at the given level with context key/value pairs 24 Debug(msg string, ctx ...interface{}) 25 26 // Log a message at the given level formatting message with the parameters 27 Debugf(msg string, params ...interface{}) 28 29 // Log a message at the given level with context key/value pairs 30 Info(msg string, ctx ...interface{}) 31 32 // Log a message at the given level formatting message with the parameters 33 Infof(msg string, params ...interface{}) 34 35 // Log a message at the given level with context key/value pairs 36 Warn(msg string, ctx ...interface{}) 37 38 // Log a message at the given level formatting message with the parameters 39 Warnf(msg string, params ...interface{}) 40 41 // Log a message at the given level with context key/value pairs 42 Error(msg string, ctx ...interface{}) 43 44 // Log a message at the given level formatting message with the parameters 45 Errorf(msg string, params ...interface{}) 46 47 // Log a message at the given level with context key/value pairs 48 Crit(msg string, ctx ...interface{}) 49 50 // Log a message at the given level formatting message with the parameters 51 Critf(msg string, params ...interface{}) 52 53 // Log a message at the given level with context key/value pairs and exits 54 Fatal(msg string, ctx ...interface{}) 55 56 // Log a message at the given level formatting message with the parameters and exits 57 Fatalf(msg string, params ...interface{}) 58 59 // Log a message at the given level with context key/value pairs and panics 60 Panic(msg string, ctx ...interface{}) 61 62 // Log a message at the given level formatting message with the parameters and panics 63 Panicf(msg string, params ...interface{}) 64 } 65 66 // The log handler interface 67 LogHandler interface { 68 Log(*Record) error 69 //log15.Handler 70 } 71 72 // The log stack handler interface 73 LogStackHandler interface { 74 LogHandler 75 GetStack() int 76 } 77 78 // The log handler interface which has child logs 79 ParentLogHandler interface { 80 SetChild(handler LogHandler) LogHandler 81 } 82 83 // The log format interface 84 LogFormat interface { 85 Format(r *Record) []byte 86 } 87 88 // The log level type 89 LogLevel int 90 91 // Used for the callback to LogFunctionMap 92 LogOptions struct { 93 Ctx *config.Context 94 ReplaceExistingHandler bool 95 HandlerWrap ParentLogHandler 96 Levels []LogLevel 97 ExtendedOptions map[string]interface{} 98 } 99 100 // The log record 101 Record struct { 102 Message string // The message 103 Time time.Time // The time 104 Level LogLevel //The level 105 Call CallStack // The call stack if built 106 Context ContextMap // The context 107 } 108 109 // The lazy structure to implement a function to be invoked only if needed 110 Lazy struct { 111 Fn interface{} // the function 112 } 113 114 // Currently the only requirement for the callstack is to support the Formatter method 115 // which stack.Call does so we use that 116 CallStack interface { 117 fmt.Formatter // Requirement 118 } 119 ) 120 121 // FormatFunc returns a new Format object which uses 122 // the given function to perform record formatting. 123 func FormatFunc(f func(*Record) []byte) LogFormat { 124 return formatFunc(f) 125 } 126 127 type formatFunc func(*Record) []byte 128 129 func (f formatFunc) Format(r *Record) []byte { 130 return f(r) 131 } 132 func NewRecord(message string, level LogLevel) *Record { 133 return &Record{Message: message, Context: ContextMap{}, Level: level} 134 } 135 136 const ( 137 LvlCrit LogLevel = iota // Critical 138 LvlError // Error 139 LvlWarn // Warning 140 LvlInfo // Information 141 LvlDebug // Debug 142 ) 143 144 // A list of all the log levels 145 var LvlAllList = []LogLevel{LvlDebug, LvlInfo, LvlWarn, LvlError, LvlCrit} 146 147 // Implements the ParentLogHandler 148 type parentLogHandler struct { 149 setChild func(handler LogHandler) LogHandler 150 } 151 152 // Create a new parent log handler 153 func NewParentLogHandler(callBack func(child LogHandler) LogHandler) ParentLogHandler { 154 return &parentLogHandler{callBack} 155 } 156 157 // Sets the child of the log handler 158 func (p *parentLogHandler) SetChild(child LogHandler) LogHandler { 159 return p.setChild(child) 160 } 161 162 // Create a new log options 163 func NewLogOptions(cfg *config.Context, replaceHandler bool, phandler ParentLogHandler, lvl ...LogLevel) (logOptions *LogOptions) { 164 logOptions = &LogOptions{ 165 Ctx: cfg, 166 ReplaceExistingHandler: replaceHandler, 167 HandlerWrap: phandler, 168 Levels: lvl, 169 ExtendedOptions: map[string]interface{}{}, 170 } 171 return 172 } 173 174 // Assumes options will be an even number and have a string, value syntax 175 func (l *LogOptions) SetExtendedOptions(options ...interface{}) { 176 for x := 0; x < len(options); x += 2 { 177 l.ExtendedOptions[options[x].(string)] = options[x+1] 178 } 179 } 180 181 // Gets a string option with default 182 func (l *LogOptions) GetStringDefault(option, value string) string { 183 if v, found := l.ExtendedOptions[option]; found { 184 return v.(string) 185 } 186 return value 187 } 188 189 // Gets an int option with default 190 func (l *LogOptions) GetIntDefault(option string, value int) int { 191 if v, found := l.ExtendedOptions[option]; found { 192 return v.(int) 193 } 194 return value 195 } 196 197 // Gets a boolean option with default 198 func (l *LogOptions) GetBoolDefault(option string, value bool) bool { 199 if v, found := l.ExtendedOptions[option]; found { 200 return v.(bool) 201 } 202 return value 203 }