logger_config.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // Copyright 2025 BackendServerTemplate Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package config
  5. import (
  6. "github.com/SongZihuan/BackendServerTemplate/src/config/configerror"
  7. "github.com/SongZihuan/BackendServerTemplate/src/config/configparser"
  8. "github.com/SongZihuan/BackendServerTemplate/src/logger"
  9. "github.com/SongZihuan/BackendServerTemplate/src/logger/loglevel"
  10. "github.com/SongZihuan/BackendServerTemplate/src/logger/write/combiningwriter"
  11. "github.com/SongZihuan/BackendServerTemplate/src/logger/write/nonewriter"
  12. "github.com/SongZihuan/BackendServerTemplate/src/utils/typeutils"
  13. )
  14. type LoggerConfig struct {
  15. LogLevel loglevel.LoggerLevel `json:"log-level" yaml:"log-level" mapstructure:"log-level"`
  16. LogTag typeutils.StringBool `json:"log-tag" yaml:"log-tag" mapstructure:"log-tag"`
  17. HumanWarnWriter LoggerWriterConfig `json:"human-warn-writer" yaml:"human-warn-writer" mapstructure:"human-warn-writer"`
  18. HumanErrWriter LoggerWriterConfig `json:"human-error-writer" yaml:"human-error-writer" mapstructure:"human-error-writer"`
  19. MachineWarnWriter LoggerWriterConfig `json:"machine-warn-writer" yaml:"machine-warn-writer" mapstructure:"machine-warn-writer"`
  20. MachineErrWriter LoggerWriterConfig `json:"machine-error-writer" yaml:"machine-error-writer" mapstructure:"machine-error-writer"`
  21. }
  22. func (d *LoggerConfig) init(filePath string, provider configparser.ConfigParserProvider) (err configerror.Error) {
  23. cfgErr := d.HumanWarnWriter.init(filePath, provider)
  24. if cfgErr != nil {
  25. return cfgErr
  26. }
  27. cfgErr = d.HumanErrWriter.init(filePath, provider)
  28. if cfgErr != nil {
  29. return cfgErr
  30. }
  31. cfgErr = d.MachineWarnWriter.init(filePath, provider)
  32. if cfgErr != nil {
  33. return cfgErr
  34. }
  35. cfgErr = d.MachineErrWriter.init(filePath, provider)
  36. if cfgErr != nil {
  37. return cfgErr
  38. }
  39. return nil
  40. }
  41. func (d *LoggerConfig) setDefault(c *configInfo) (err configerror.Error) {
  42. if d.LogLevel == "" {
  43. if c.data.GlobalConfig.IsRelease() {
  44. d.LogLevel = loglevel.LevelInfo
  45. d.LogTag.SetDefaultDisable()
  46. } else {
  47. d.LogLevel = loglevel.LevelDebug
  48. d.LogTag.SetDefaultEnable()
  49. }
  50. }
  51. cfgErr := d.HumanWarnWriter.setDefault(c)
  52. if cfgErr != nil {
  53. return cfgErr
  54. }
  55. cfgErr = d.HumanErrWriter.setDefault(c)
  56. if cfgErr != nil {
  57. return cfgErr
  58. }
  59. cfgErr = d.MachineWarnWriter.setDefault(c)
  60. if cfgErr != nil {
  61. return cfgErr
  62. }
  63. cfgErr = d.MachineErrWriter.setDefault(c)
  64. if cfgErr != nil {
  65. return cfgErr
  66. }
  67. return nil
  68. }
  69. func (d *LoggerConfig) check(c *configInfo) (err configerror.Error) {
  70. cfgErr := d.HumanWarnWriter.check(c)
  71. if cfgErr != nil {
  72. return cfgErr
  73. }
  74. cfgErr = d.HumanErrWriter.check(c)
  75. if cfgErr != nil {
  76. return cfgErr
  77. }
  78. cfgErr = d.MachineWarnWriter.check(c)
  79. if cfgErr != nil {
  80. return cfgErr
  81. }
  82. cfgErr = d.MachineErrWriter.check(c)
  83. if cfgErr != nil {
  84. return cfgErr
  85. }
  86. return nil
  87. }
  88. func (d *LoggerConfig) process(c *configInfo) (cfgErr configerror.Error) {
  89. err := logger.SetLevel(d.LogLevel)
  90. if err != nil {
  91. return configerror.NewErrorf("set log level error: %s", err.Error())
  92. }
  93. err = logger.SetLogTag(d.LogTag.IsEnable(false))
  94. if err != nil {
  95. return configerror.NewErrorf("set log tag error: %s", err.Error())
  96. }
  97. humanWarn, cfgErr := d.HumanWarnWriter.process(c, false)
  98. if cfgErr != nil {
  99. return cfgErr
  100. }
  101. humanErr, cfgErr := d.HumanErrWriter.process(c, false)
  102. if cfgErr != nil {
  103. return cfgErr
  104. }
  105. machineWarn, cfgErr := d.MachineWarnWriter.process(c, true)
  106. if cfgErr != nil {
  107. return cfgErr
  108. }
  109. machineErr, cfgErr := d.MachineErrWriter.process(c, true)
  110. if cfgErr != nil {
  111. return cfgErr
  112. }
  113. logWarn := append(humanWarn, machineWarn...)
  114. logErr := append(humanErr, machineErr...)
  115. if len(logWarn) == 0 {
  116. _, err := logger.SetWarnWriter(nonewriter.NewNoneWriter())
  117. if err != nil {
  118. return configerror.NewErrorf("set warn writer error: %s", err.Error())
  119. }
  120. } else if len(logWarn) == 1 {
  121. _, err := logger.SetWarnWriter(logWarn[0])
  122. if err != nil {
  123. return configerror.NewErrorf("set warn writer error: %s", err.Error())
  124. }
  125. } else {
  126. combiningWriter := combiningwriter.NewCombiningWriter(logWarn...)
  127. _, err := logger.SetWarnWriter(combiningWriter)
  128. if err != nil {
  129. return configerror.NewErrorf("set warn combining writer error: %s", err.Error())
  130. }
  131. }
  132. if len(logErr) == 0 {
  133. _, err := logger.SetErrWriter(nonewriter.NewNoneWriter())
  134. if err != nil {
  135. return configerror.NewErrorf("set error writer error: %s", err.Error())
  136. }
  137. } else if len(logErr) == 1 {
  138. _, err := logger.SetErrWriter(logErr[0])
  139. if err != nil {
  140. return configerror.NewErrorf("set error writer error: %s", err.Error())
  141. }
  142. } else {
  143. combiningWriter := combiningwriter.NewCombiningWriter(logErr...)
  144. _, err := logger.SetErrWriter(combiningWriter)
  145. if err != nil {
  146. return configerror.NewErrorf("set error combining writer error: %s", err.Error())
  147. }
  148. }
  149. return nil
  150. }