logger.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package sdk
  2. import (
  3. "encoding/json"
  4. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
  5. "io"
  6. "log"
  7. "os"
  8. "strings"
  9. "time"
  10. )
  11. var logChannel string
  12. var defaultChannel = "AlibabaCloud"
  13. type Logger struct {
  14. *log.Logger
  15. formatTemplate string
  16. isOpen bool
  17. lastLogMsg string
  18. }
  19. var defaultLoggerTemplate = `{time} {channel}: "{method} {uri} HTTP/{version}" {code} {cost} {hostname}`
  20. var loggerParam = []string{"{time}", "{start_time}", "{ts}", "{channel}", "{pid}", "{host}", "{method}", "{uri}", "{version}", "{target}", "{hostname}", "{code}", "{error}", "{req_headers}", "{res_body}", "{res_headers}", "{cost}"}
  21. func initLogMsg(fieldMap map[string]string) {
  22. for _, value := range loggerParam {
  23. fieldMap[value] = ""
  24. }
  25. }
  26. func (client *Client) GetLogger() *Logger {
  27. return client.logger
  28. }
  29. func (client *Client) GetLoggerMsg() string {
  30. if client.logger == nil {
  31. client.SetLogger("", "", os.Stdout, "")
  32. }
  33. return client.logger.lastLogMsg
  34. }
  35. func (client *Client) SetLogger(level string, channel string, out io.Writer, template string) {
  36. if level == "" {
  37. level = "info"
  38. }
  39. logChannel = "AlibabaCloud"
  40. if channel != "" {
  41. logChannel = channel
  42. }
  43. log := log.New(out, "["+strings.ToUpper(level)+"]", log.Lshortfile)
  44. if template == "" {
  45. template = defaultLoggerTemplate
  46. }
  47. client.logger = &Logger{
  48. Logger: log,
  49. formatTemplate: template,
  50. isOpen: true,
  51. }
  52. }
  53. func (client *Client) OpenLogger() {
  54. if client.logger == nil {
  55. client.SetLogger("", "", os.Stdout, "")
  56. }
  57. client.logger.isOpen = true
  58. }
  59. func (client *Client) CloseLogger() {
  60. if client.logger != nil {
  61. client.logger.isOpen = false
  62. }
  63. }
  64. func (client *Client) SetTemplate(template string) {
  65. if client.logger == nil {
  66. client.SetLogger("", "", os.Stdout, "")
  67. }
  68. client.logger.formatTemplate = template
  69. }
  70. func (client *Client) GetTemplate() string {
  71. if client.logger == nil {
  72. client.SetLogger("", "", os.Stdout, "")
  73. }
  74. return client.logger.formatTemplate
  75. }
  76. func TransToString(object interface{}) string {
  77. byt, err := json.Marshal(object)
  78. if err != nil {
  79. return ""
  80. }
  81. return string(byt)
  82. }
  83. func (client *Client) printLog(fieldMap map[string]string, err error) {
  84. if err != nil {
  85. fieldMap["{error}"] = err.Error()
  86. }
  87. fieldMap["{time}"] = time.Now().Format("2006-01-02 15:04:05")
  88. fieldMap["{ts}"] = utils.GetTimeInFormatISO8601()
  89. fieldMap["{channel}"] = logChannel
  90. if client.logger != nil {
  91. logMsg := client.logger.formatTemplate
  92. for key, value := range fieldMap {
  93. logMsg = strings.Replace(logMsg, key, value, -1)
  94. }
  95. client.logger.lastLogMsg = logMsg
  96. if client.logger.isOpen == true {
  97. client.logger.Output(2, logMsg)
  98. }
  99. }
  100. }