logger.go raw

   1  package utils
   2  
   3  import (
   4  	"io"
   5  	"log"
   6  	"strings"
   7  	"time"
   8  )
   9  
  10  var defaultLoggerTemplate = `{time} {channel}: "{method} {uri} HTTP/{version}" {code} {cost} {hostname}`
  11  var loggerParam = []string{"{time}", "{start_time}", "{ts}", "{channel}", "{pid}", "{host}", "{method}", "{uri}", "{version}", "{target}", "{hostname}", "{code}", "{error}", "{req_headers}", "{res_body}", "{res_headers}", "{cost}"}
  12  var logChannel string
  13  
  14  type Logger struct {
  15  	*log.Logger
  16  	formatTemplate string
  17  	isOpen         bool
  18  	lastLogMsg     string
  19  }
  20  
  21  func InitLogMsg(fieldMap map[string]string) {
  22  	for _, value := range loggerParam {
  23  		fieldMap[value] = ""
  24  	}
  25  }
  26  
  27  func (logger *Logger) SetFormatTemplate(template string) {
  28  	logger.formatTemplate = template
  29  
  30  }
  31  
  32  func (logger *Logger) GetFormatTemplate() string {
  33  	return logger.formatTemplate
  34  
  35  }
  36  
  37  func NewLogger(level string, channel string, out io.Writer, template string) *Logger {
  38  	if level == "" {
  39  		level = "info"
  40  	}
  41  
  42  	logChannel = "AlibabaCloud"
  43  	if channel != "" {
  44  		logChannel = channel
  45  	}
  46  	log := log.New(out, "["+strings.ToUpper(level)+"]", log.Lshortfile)
  47  	if template == "" {
  48  		template = defaultLoggerTemplate
  49  	}
  50  
  51  	return &Logger{
  52  		Logger:         log,
  53  		formatTemplate: template,
  54  		isOpen:         true,
  55  	}
  56  }
  57  
  58  func (logger *Logger) OpenLogger() {
  59  	logger.isOpen = true
  60  }
  61  
  62  func (logger *Logger) CloseLogger() {
  63  	logger.isOpen = false
  64  }
  65  
  66  func (logger *Logger) SetIsopen(isopen bool) {
  67  	logger.isOpen = isopen
  68  }
  69  
  70  func (logger *Logger) GetIsopen() bool {
  71  	return logger.isOpen
  72  }
  73  
  74  func (logger *Logger) SetLastLogMsg(lastLogMsg string) {
  75  	logger.lastLogMsg = lastLogMsg
  76  }
  77  
  78  func (logger *Logger) GetLastLogMsg() string {
  79  	return logger.lastLogMsg
  80  }
  81  
  82  func SetLogChannel(channel string) {
  83  	logChannel = channel
  84  }
  85  
  86  func (logger *Logger) PrintLog(fieldMap map[string]string, err error) {
  87  	if err != nil {
  88  		fieldMap["{error}"] = err.Error()
  89  	}
  90  	fieldMap["{time}"] = time.Now().Format("2006-01-02 15:04:05")
  91  	fieldMap["{ts}"] = getTimeInFormatISO8601()
  92  	fieldMap["{channel}"] = logChannel
  93  	if logger != nil {
  94  		logMsg := logger.formatTemplate
  95  		for key, value := range fieldMap {
  96  			logMsg = strings.Replace(logMsg, key, value, -1)
  97  		}
  98  		logger.lastLogMsg = logMsg
  99  		if logger.isOpen == true {
 100  			logger.Output(2, logMsg)
 101  		}
 102  	}
 103  }
 104  
 105  func getTimeInFormatISO8601() (timeStr string) {
 106  	gmt := time.FixedZone("GMT", 0)
 107  
 108  	return time.Now().In(gmt).Format("2006-01-02T15:04:05Z")
 109  }
 110