access_log.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "strconv"
  6. "time"
  7. )
  8. type AccessLoggerLevelConfig struct {
  9. OutputLevel DWSILogLevel
  10. SuccessLevel DWSILogLevel
  11. NotFoundLevel DWSILogLevel
  12. ForbiddenLevel DWSILogLevel
  13. GatewayErrorLevel DWSILogLevel
  14. InternalErrorLevel DWSILogLevel
  15. }
  16. func transLevelStringIntoLevel(lvstr string) DWSILogLevel {
  17. switch lvstr {
  18. case "FATAL":
  19. return LogLv_FATAL
  20. case "PANIC":
  21. return LogLv_PANIC
  22. case "ERROR":
  23. return LogLv_ERROR
  24. case "WARN":
  25. return LogLv_WARN
  26. case "INFO":
  27. return LogLv_INFO
  28. case "DEBUG":
  29. return LogLv_DEBUG
  30. default:
  31. return LogLv_INVALID
  32. }
  33. }
  34. func transLevelIntoLevelString(lv DWSILogLevel) string {
  35. switch lv {
  36. case LogLv_FATAL:
  37. return "FATAL"
  38. case LogLv_PANIC:
  39. return "PANIC"
  40. case LogLv_ERROR:
  41. return "ERROR"
  42. case LogLv_WARN:
  43. return "WARN"
  44. case LogLv_INFO:
  45. return "INFO"
  46. case LogLv_DEBUG:
  47. return "DEBUG"
  48. default:
  49. return ""
  50. }
  51. }
  52. func ConvertLogLevelConfig(yamldata AccessLoggerConfigYAML) (error, *AccessLoggerLevelConfig) {
  53. o := &AccessLoggerLevelConfig{}
  54. o.OutputLevel = transLevelStringIntoLevel(yamldata.OutputLevel)
  55. o.SuccessLevel = transLevelStringIntoLevel(yamldata.SuccessLevel)
  56. o.NotFoundLevel = transLevelStringIntoLevel(yamldata.NotFoundLevel)
  57. o.ForbiddenLevel = transLevelStringIntoLevel(yamldata.ForbiddenLevel)
  58. o.GatewayErrorLevel = transLevelStringIntoLevel(yamldata.GatewayErrorLevel)
  59. o.InternalErrorLevel = transLevelStringIntoLevel(yamldata.InternalErrorLevel)
  60. if o.OutputLevel == 0 {
  61. return fmt.Errorf("invalid level name '%s' for output_level", yamldata.OutputLevel), o
  62. }
  63. if o.SuccessLevel == 0 {
  64. return fmt.Errorf("invalid level name '%s' for success_level", yamldata.SuccessLevel), o
  65. }
  66. if o.NotFoundLevel == 0 {
  67. return fmt.Errorf("invalid level name '%s' for not_found_level", yamldata.NotFoundLevel), o
  68. }
  69. if o.ForbiddenLevel == 0 {
  70. return fmt.Errorf("invalid level name '%s' for forbidden_level", yamldata.ForbiddenLevel), o
  71. }
  72. if o.GatewayErrorLevel == 0 {
  73. return fmt.Errorf("invalid level name '%s' for gateway_error_level", yamldata.GatewayErrorLevel), o
  74. }
  75. if o.InternalErrorLevel == 0 {
  76. return fmt.Errorf("invalid level name '%s' for internal_error_level", yamldata.InternalErrorLevel), o
  77. }
  78. return nil, o
  79. }
  80. type AccessLogger struct {
  81. enable bool
  82. level_config *AccessLoggerLevelConfig
  83. commonLogger *CommonLogger
  84. }
  85. func NewAccessLogger() *AccessLogger {
  86. return &AccessLogger{
  87. enable: false,
  88. level_config: nil,
  89. commonLogger: nil,
  90. }
  91. }
  92. func (this *AccessLogger) UseLogger(wr io.Writer, lvcfg *AccessLoggerLevelConfig, fmtstr string, useutc bool) {
  93. this.enable = true
  94. this.level_config = lvcfg
  95. this.commonLogger = NewCommonLogger(lvcfg.OutputLevel, wr)
  96. exdmap := map[string]int{
  97. "level": 8,
  98. "status": 3,
  99. "latency": 8,
  100. "cip": 20,
  101. "method": 8,
  102. "url": 1024,
  103. }
  104. this.commonLogger.SetFormatterWithCustomExData(fmtstr, exdmap, useutc)
  105. }
  106. func (this *AccessLogger) transStatusCode2Level(code int) DWSILogLevel {
  107. switch code {
  108. case 200:
  109. return this.level_config.SuccessLevel
  110. case 404:
  111. return this.level_config.NotFoundLevel
  112. case 403:
  113. return this.level_config.ForbiddenLevel
  114. case 502:
  115. return this.level_config.GatewayErrorLevel
  116. case 500:
  117. return this.level_config.InternalErrorLevel
  118. default:
  119. return this.level_config.SuccessLevel
  120. }
  121. }
  122. func (this *AccessLogger) Emit(tm time.Time, status int,
  123. latency time.Duration, cip string, method string, url string) {
  124. if this.enable {
  125. level := this.transStatusCode2Level(status)
  126. if level == LogLv_INVALID {
  127. return
  128. }
  129. lvstr := transLevelIntoLevelString(level)
  130. exd := map[string]string{
  131. "level": lvstr,
  132. "status": strconv.Itoa(status),
  133. "latency": fmt.Sprintf("%v", latency),
  134. "cip": cip,
  135. "method": method,
  136. "url": url,
  137. }
  138. this.commonLogger.RawEmitWithCustomTime(level, tm, exd)
  139. }
  140. }