GAAS GFrame项目web后台
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.

219 lines
4.7 KiB

  1. package logger
  2. import (
  3. "errors"
  4. json "github.com/json-iterator/go"
  5. "sync"
  6. )
  7. var (
  8. lock sync.Mutex
  9. // 全局log接口map
  10. loggerMap map[string]Log
  11. )
  12. type logger struct {
  13. module string
  14. pid int
  15. operator string
  16. output []driver // 输出驱动列表
  17. }
  18. // log 接口
  19. type Log interface {
  20. Debug(content string, extra ...interface{})
  21. Info(content string, extra ...interface{})
  22. Warn(content string, extra ...interface{})
  23. Error(content string, extra ...interface{})
  24. Fatal(content string, extra ...interface{})
  25. }
  26. // 获取log接口
  27. func NewLogger(operator string, module string) (Log, error) {
  28. lock.Lock()
  29. defer lock.Unlock()
  30. if loggerMap == nil {
  31. loggerMap = make(map[string]Log)
  32. }
  33. if loggerMap[module] != nil {
  34. return loggerMap[module], nil
  35. }
  36. return initLogger(module, operator)
  37. }
  38. // 根据全局配置初始化log接口
  39. func initLogger(module string, operator string) (Log, error) {
  40. pid := getPid()
  41. defaultLogger := NewDefaultLogger()
  42. innerLog := &logger{
  43. module: module,
  44. pid: pid,
  45. operator: operator,
  46. output: make([]driver, 0),
  47. }
  48. // 若没有module配置使用root配置
  49. config, exist := loggerConfig.Config[module]
  50. if !exist {
  51. config = loggerConfig.Config["root"]
  52. }
  53. for _, value := range config {
  54. levelInt := changeToInt(value.Level)
  55. // 初始化db driver
  56. if value.DriverType == "db" {
  57. driverConfig, exist := outputConfig.DB[value.DriverName]
  58. if !exist {
  59. continue
  60. }
  61. switch driverConfig.DBType {
  62. case "mongo":
  63. driver, err := NewMongoDriver(driverConfig, levelInt)
  64. if err != nil {
  65. return defaultLogger, err
  66. }
  67. innerLog.output = append(innerLog.output, driver)
  68. }
  69. } else if value.DriverType == "file" { // 初始话file driver
  70. driverConfig, exist := outputConfig.File[value.DriverName]
  71. if !exist {
  72. continue
  73. }
  74. driver, err := NewFileDriver(driverConfig, levelInt)
  75. if err != nil {
  76. return defaultLogger, err
  77. }
  78. innerLog.output = append(innerLog.output, driver)
  79. } else if value.DriverType == "console" { // 初始化console driver
  80. driverConfig := outputConfig.Console
  81. driver, err := NewConsoleDriver(driverConfig)
  82. if err != nil {
  83. return defaultLogger, err
  84. }
  85. innerLog.output = append(innerLog.output, driver)
  86. }
  87. }
  88. if len(innerLog.output) == 0 {
  89. return defaultLogger, errors.New("未获取到日志输出驱动")
  90. }
  91. loggerMap[module] = innerLog
  92. return innerLog, nil
  93. }
  94. func (l *logger) Debug(content string, extra ...interface{}) {
  95. date := getToday()
  96. t := getCurrentTime()
  97. caller := getCaller(2)
  98. extraStr, err := json.Marshal(extra)
  99. if err != nil {
  100. return
  101. }
  102. message := message{
  103. Level: DebugLevel,
  104. Module: l.module,
  105. Content: content,
  106. Date: date,
  107. Time: t,
  108. Caller: caller,
  109. Extra: string(extraStr),
  110. Pid: l.pid,
  111. Operator: l.operator,
  112. }
  113. for _, driver := range l.output {
  114. driver.Record(message)
  115. }
  116. }
  117. func (l *logger) Info(content string, extra ...interface{}) {
  118. date := getToday()
  119. t := getCurrentTime()
  120. caller := getCaller(2)
  121. extraStr, err := json.Marshal(extra)
  122. if err != nil {
  123. return
  124. }
  125. message := message{
  126. Level: infoLevel,
  127. Module: l.module,
  128. Content: content,
  129. Date: date,
  130. Time: t,
  131. Caller: caller,
  132. Extra: string(extraStr),
  133. Pid: l.pid,
  134. Operator: l.operator,
  135. }
  136. for _, driver := range l.output {
  137. driver.Record(message)
  138. }
  139. }
  140. func (l *logger) Warn(content string, extra ...interface{}) {
  141. date := getToday()
  142. t := getCurrentTime()
  143. caller := getCaller(2)
  144. extraStr, err := json.Marshal(extra)
  145. if err != nil {
  146. return
  147. }
  148. message := message{
  149. Level: WarnLevel,
  150. Module: l.module,
  151. Content: content,
  152. Date: date,
  153. Time: t,
  154. Caller: caller,
  155. Extra: string(extraStr),
  156. Pid: l.pid,
  157. Operator: l.operator,
  158. }
  159. for _, driver := range l.output {
  160. driver.Record(message)
  161. }
  162. }
  163. func (l *logger) Error(content string, extra ...interface{}) {
  164. date := getToday()
  165. t := getCurrentTime()
  166. caller := getCaller(2)
  167. extraStr, err := json.Marshal(extra)
  168. if err != nil {
  169. return
  170. }
  171. message := message{
  172. Level: ErrorLevel,
  173. Module: l.module,
  174. Content: content,
  175. Date: date,
  176. Time: t,
  177. Caller: caller,
  178. Extra: string(extraStr),
  179. Pid: l.pid,
  180. Operator: l.operator,
  181. }
  182. for _, driver := range l.output {
  183. driver.Record(message)
  184. }
  185. }
  186. func (l *logger) Fatal(content string, extra ...interface{}) {
  187. date := getToday()
  188. t := getCurrentTime()
  189. caller := getCaller(2)
  190. extraStr, err := json.Marshal(extra)
  191. if err != nil {
  192. return
  193. }
  194. message := message{
  195. Level: FatalLevel,
  196. Module: l.module,
  197. Content: content,
  198. Date: date,
  199. Time: t,
  200. Caller: caller,
  201. Extra: string(extraStr),
  202. Pid: l.pid,
  203. Operator: l.operator,
  204. }
  205. for _, driver := range l.output {
  206. driver.Record(message)
  207. }
  208. }