高热共公日志库
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.

146 lines
3.2 KiB

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