logger.go raw

   1  package client
   2  
   3  import (
   4  	"log"
   5  	"net/http"
   6  	"net/http/httputil"
   7  	"regexp"
   8  	"strings"
   9  
  10  	"github.com/ultradns/ultradns-go-sdk/internal/version"
  11  )
  12  
  13  type logLevelType int
  14  
  15  const (
  16  	LogOff logLevelType = iota
  17  	LogError
  18  	LogWarn
  19  	LogDebug
  20  	LogTrace
  21  )
  22  
  23  const defaultLogFlags = log.Ldate | log.Lmicroseconds | log.Lmsgprefix
  24  
  25  type logger struct {
  26  	logLevel logLevelType
  27  	logger   *log.Logger
  28  }
  29  
  30  func (l logger) getLogPrefix(logLevel logLevelType) string {
  31  	switch logLevel {
  32  	case LogError:
  33  		return "[ERROR] "
  34  	case LogWarn:
  35  		return "[WARN]"
  36  	case LogDebug:
  37  		return "[DEBUG] "
  38  	case LogTrace:
  39  		return "[TRACE] "
  40  	}
  41  
  42  	return ""
  43  }
  44  
  45  func (c *Client) logHttpRequest(req *http.Request) {
  46  	if c.logger.logLevel >= LogDebug && req != nil {
  47  		data, _ := httputil.DumpRequest(req, true)
  48  		c.Debug("HTTP Request Sent:\n\t%s", formatHttpLog(data))
  49  	}
  50  }
  51  
  52  func (c *Client) logHttpResponse(res *http.Response) {
  53  	if c.logger.logLevel >= LogDebug && res != nil {
  54  		data, _ := httputil.DumpResponse(res, true)
  55  		c.Debug("HTTP Response Received:\n\t%s", formatHttpLog(data))
  56  	}
  57  }
  58  
  59  func formatHttpLog(data []byte) string {
  60  	str := strings.TrimRight(string(data), "\n")
  61  	str = regexp.MustCompile(`\r?\n`).ReplaceAllString(str, "\r\n\t")
  62  	return str
  63  }
  64  
  65  func (l logger) logf(logType logLevelType, format string, v ...any) {
  66  	if l.logLevel >= logType && l.logger != nil {
  67  		l.logger.SetPrefix(l.getLogPrefix(logType))
  68  		l.logger.Printf("["+version.GetSDKVersion()+"] "+format+"\n", v...)
  69  	}
  70  }
  71  
  72  func (c *Client) Error(format string, v ...any) {
  73  	c.logger.logf(LogError, format, v...)
  74  }
  75  
  76  func (c *Client) Warn(format string, v ...any) {
  77  	c.logger.logf(LogWarn, format, v...)
  78  }
  79  
  80  func (c *Client) Debug(format string, v ...any) {
  81  	c.logger.logf(LogDebug, format, v...)
  82  }
  83  
  84  func (c *Client) Trace(format string, v ...any) {
  85  	c.logger.logf(LogTrace, format, v...)
  86  }
  87  
  88  func (c *Client) EnableDefaultWarnLogger() {
  89  	c.EnableLogger(LogWarn, defaultLogFlags)
  90  }
  91  
  92  func (c *Client) EnableDefaultDebugLogger() {
  93  	c.EnableLogger(LogDebug, defaultLogFlags)
  94  }
  95  
  96  func (c *Client) EnableDefaultTraceLogger() {
  97  	c.EnableLogger(LogTrace, defaultLogFlags)
  98  }
  99  
 100  func (c *Client) EnableLogger(logLevel logLevelType, flags int) {
 101  	c.logger.logLevel = logLevel
 102  	c.logger.logger = log.Default()
 103  	c.logger.logger.SetFlags(flags)
 104  }
 105  
 106  func (c *Client) DisableLogger() {
 107  	c.logger.logLevel = LogOff
 108  }
 109