You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
3.5 KiB

  1. package grlogs
  2. import (
  3. "fmt"
  4. "golib.gaore.com/GaoreGo/haiwai-grlogs/v2/logs"
  5. "os"
  6. "sync"
  7. )
  8. var loggers = sync.Map{}
  9. var runmode = "CENTER_RUNMODE"
  10. var envKey = "GAORE_ENVIRONMENT"
  11. var defaultModeMapping = map[string][]AdapterTupple{
  12. "es": []AdapterTupple{{LevelAll, AdapterConsole}, {LevelAll, AdapterElasticSearch}},
  13. "ali": []AdapterTupple{{LevelAll, AdapterConsole}, {LevelAll, AdapterAliLs}},
  14. "": []AdapterTupple{{LevelAll, AdapterConsole}, {LevelAll, AdapterFile}},
  15. }
  16. type Logger struct {
  17. Lable string
  18. *logs.BeeLogger
  19. }
  20. type Getter func() *Logger
  21. func (self *Logger) SetAdapter(level Level, adapter Adapter) *Logger {
  22. if call, ok := adatperSetMapper[adapter]; ok {
  23. if err := call(self, level); err != nil {
  24. fmt.Println(err)
  25. }
  26. }
  27. return self
  28. }
  29. func (self *Logger) DropAdapter(adapter Adapter) *Logger {
  30. if call, ok := adatperDropMapper[adapter]; ok {
  31. if err := call(self); err != nil {
  32. fmt.Println(err)
  33. }
  34. }
  35. return self
  36. }
  37. func newLoggerFromMap(label string, defaultmode string, channelLens ...int64) Getter {
  38. if tmp, ok := loggers.Load(label); ok {
  39. return tmp.(Getter)
  40. }
  41. var l *Logger
  42. var once sync.Once
  43. wapperGetter := Getter(func() *Logger {
  44. once.Do(func() {
  45. var channelLensNum int64 = 100
  46. if len(channelLens) > 0 && channelLens[0] > 0 {
  47. channelLensNum = channelLens[0]
  48. }
  49. l = &Logger{BeeLogger: logs.NewLogger(channelLensNum)}
  50. l.Lable = label
  51. l.BeeLogger = logs.NewLogger(channelLensNum)
  52. l.BeeLogger.Label = label
  53. l.Env = os.Getenv(envKey)
  54. l.SetPrefix(fmt.Sprintf("[env:%s logger:%s]", l.Env, label))
  55. l.EnableFuncCallDepth(true)
  56. l.SetLogFuncCallDepth(2)
  57. if mode, ok := defaultModeMapping[defaultmode]; ok {
  58. for _, v := range mode {
  59. l.SetAdapter(v.Level, v.Adapter)
  60. }
  61. }
  62. })
  63. return l
  64. })
  65. tmp, loaded := loggers.LoadOrStore(label, wapperGetter)
  66. if loaded {
  67. return tmp.(Getter)
  68. }
  69. return wapperGetter
  70. }
  71. func Get(label string, channelLens ...int64) *Logger {
  72. getter := newLoggerFromMap(label, "", channelLens...)
  73. return getter()
  74. }
  75. func GetEs(label string, channelLens ...int64) *Logger {
  76. getter := newLoggerFromMap(label, "es", channelLens...)
  77. return getter()
  78. }
  79. func GetAli(label string, channelLens ...int64) *Logger {
  80. getter := newLoggerFromMap(label, "ali", channelLens...)
  81. return getter()
  82. }
  83. func Close(lables ...string) {
  84. wg := &sync.WaitGroup{}
  85. for _, lable := range lables {
  86. wg.Add(1)
  87. go func(lable string) {
  88. if v, ok := loggers.Load(lable); ok {
  89. if tmp, ok := v.(*Logger); ok {
  90. loggers.Delete(lable)
  91. tmp.BeeLogger.Close()
  92. }
  93. }
  94. wg.Done()
  95. }(lable)
  96. }
  97. wg.Wait()
  98. }
  99. func CloseAll() {
  100. wg := &sync.WaitGroup{}
  101. loggers.Range(func(key, value interface{}) bool {
  102. wg.Add(1)
  103. go func() {
  104. if tmp, ok := value.(*Logger); ok {
  105. tmp.BeeLogger.Close()
  106. loggers.Delete(key)
  107. }
  108. wg.Done()
  109. }()
  110. return true
  111. })
  112. wg.Wait()
  113. }
  114. func init() {
  115. var level Level = LevelInfo
  116. if os.Getenv(runmode) == "dev" {
  117. level = LevelAll
  118. }
  119. defaultModeMapping["es"] = []AdapterTupple{{level, AdapterConsole}, {level, AdapterElasticSearch}}
  120. defaultModeMapping[""] = []AdapterTupple{{level, AdapterConsole}, {level, AdapterFile}}
  121. defaultModeMapping["ali"] = []AdapterTupple{{level, AdapterConsole}}
  122. env := os.Getenv(envKey)
  123. if env == "production" || env == "gray" || os.Getenv("GRLOG_INTERNET") == "public" {
  124. defaultModeMapping["ali"] = append(defaultModeMapping["ali"], AdapterTupple{level, AdapterAliLs})
  125. } else {
  126. defaultModeMapping["ali"] = append(defaultModeMapping["ali"], AdapterTupple{level, AdapterFile})
  127. }
  128. }