access_log.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "strconv"
  6. )
  7. type AccessLoggerLevelConfig struct {
  8. OutputLevel DWSILogLevel
  9. SuccessLevel DWSILogLevel
  10. NotFoundLevel DWSILogLevel
  11. ForbiddenLevel DWSILogLevel
  12. GatewayErrorLevel DWSILogLevel
  13. InternalErrorLevel DWSILogLevel
  14. }
  15. func transLevelStringIntoLevel(lvstr string) DWSILogLevel {
  16. switch lvstr {
  17. case "FATAL":
  18. return LogLv_FATAL
  19. case "PANIC":
  20. return LogLv_PANIC
  21. case "ERROR":
  22. return LogLv_ERROR
  23. case "WARN":
  24. return LogLv_WARN
  25. case "INFO":
  26. return LogLv_INFO
  27. case "DEBUG":
  28. return LogLv_DEBUG
  29. default:
  30. return LogLv_INVALID
  31. }
  32. }
  33. func transLevelIntoLevelString(lv DWSILogLevel) string {
  34. switch lv {
  35. case LogLv_FATAL:
  36. return "FATAL"
  37. case LogLv_PANIC:
  38. return "PANIC"
  39. case LogLv_ERROR:
  40. return "ERROR"
  41. case LogLv_WARN:
  42. return "WARN"
  43. case LogLv_INFO:
  44. return "INFO"
  45. case LogLv_DEBUG:
  46. return "DEBUG"
  47. default:
  48. return ""
  49. }
  50. }
  51. func ConvertLogLevelConfig(yamldata AccessLoggerConfigYAML) (error, *AccessLoggerLevelConfig) {
  52. o := &AccessLoggerLevelConfig{}
  53. o.OutputLevel = transLevelStringIntoLevel(yamldata.OutputLevel)
  54. o.SuccessLevel = transLevelStringIntoLevel(yamldata.SuccessLevel)
  55. o.NotFoundLevel = transLevelStringIntoLevel(yamldata.NotFoundLevel)
  56. o.ForbiddenLevel = transLevelStringIntoLevel(yamldata.ForbiddenLevel)
  57. o.GatewayErrorLevel = transLevelStringIntoLevel(yamldata.GatewayErrorLevel)
  58. o.InternalErrorLevel = transLevelStringIntoLevel(yamldata.InternalErrorLevel)
  59. if o.OutputLevel == 0 {
  60. return fmt.Errorf("invalid level name '%s' for output_level", yamldata.OutputLevel), o
  61. }
  62. if o.SuccessLevel == 0 {
  63. return fmt.Errorf("invalid level name '%s' for success_level", yamldata.SuccessLevel), o
  64. }
  65. if o.NotFoundLevel == 0 {
  66. return fmt.Errorf("invalid level name '%s' for not_found_level", yamldata.NotFoundLevel), o
  67. }
  68. if o.ForbiddenLevel == 0 {
  69. return fmt.Errorf("invalid level name '%s' for forbidden_level", yamldata.ForbiddenLevel), o
  70. }
  71. if o.GatewayErrorLevel == 0 {
  72. return fmt.Errorf("invalid level name '%s' for gateway_error_level", yamldata.GatewayErrorLevel), o
  73. }
  74. if o.InternalErrorLevel == 0 {
  75. return fmt.Errorf("invalid level name '%s' for internal_error_level", yamldata.InternalErrorLevel), o
  76. }
  77. return nil, o
  78. }
  79. type AccessLogger struct {
  80. enable bool
  81. level_config *AccessLoggerLevelConfig
  82. commonLogger *CommonLogger
  83. }
  84. func NewAccessLogger() *AccessLogger {
  85. return &AccessLogger{
  86. enable: false,
  87. level_config: nil,
  88. commonLogger: nil,
  89. }
  90. }
  91. func (this *AccessLogger) UseLogger(wr io.Writer, lvcfg *AccessLoggerLevelConfig) {
  92. this.enable = true
  93. this.level_config = lvcfg
  94. this.commonLogger = NewCommonLogger(lvcfg.OutputLevel, wr)
  95. }
  96. func (this *AccessLogger) Emit(level DWSILogLevel, url string, status int) {
  97. if this.enable {
  98. if level == LogLv_INVALID {
  99. return
  100. }
  101. lvstr := transLevelIntoLevelString(level)
  102. exd := map[string]string{
  103. "level": lvstr,
  104. "status": strconv.Itoa(status),
  105. "url": url,
  106. }
  107. this.commonLogger.RawEmit(level, exd)
  108. }
  109. }
  110. func (this *AccessLogger) LogResponse() {
  111. // TODO: Fix
  112. }