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  }