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