yamlutil.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package hieda_yamlutil
  2. import (
  3. "fmt"
  4. "git.swzry.com/zry/GoHiedaLogger/hiedabke_alisls"
  5. "git.swzry.com/zry/GoHiedaLogger/hiedabke_writer"
  6. "git.swzry.com/zry/GoHiedaLogger/hiedalog"
  7. "gopkg.in/natefinch/lumberjack.v2"
  8. "io"
  9. "os"
  10. )
  11. func (hyu *HiedaLogYamlUtil) parseConsoleBackend(backend CommonLogConfigYAML_Backend) (hiedalog.HiedaLogBackend, error) {
  12. if backend.ConsoleConfig == nil {
  13. return nil, fmt.Errorf("no field named 'console_config' for backend type 'console'")
  14. }
  15. switch backend.ConsoleConfig.To {
  16. case "stdout":
  17. return NewSimpleConsoleBackend(os.Stdout), nil
  18. case "stderr":
  19. return NewSimpleConsoleBackend(os.Stderr), nil
  20. default:
  21. return nil, fmt.Errorf("invalid target '%s' for 'to' field of 'console_config'", backend.ConsoleConfig.To)
  22. }
  23. }
  24. func (hyu *HiedaLogYamlUtil) parseFileBackend(backend CommonLogConfigYAML_Backend) (hiedalog.HiedaLogBackend, error) {
  25. if backend.FileConfig == nil {
  26. return nil, fmt.Errorf("no field named 'file_config' for backend type 'file'")
  27. }
  28. var iof io.Writer
  29. if backend.FileConfig.Rotate {
  30. if backend.FileConfig.RotateConfig == nil {
  31. return nil, fmt.Errorf("rotate enabled but no field named 'rotate_config'")
  32. }
  33. iof = &lumberjack.Logger{
  34. Filename: backend.FileConfig.Filename,
  35. MaxSize: backend.FileConfig.RotateConfig.MaxSize,
  36. MaxAge: backend.FileConfig.RotateConfig.MaxAge,
  37. MaxBackups: backend.FileConfig.RotateConfig.MaxBackups,
  38. LocalTime: backend.FileConfig.RotateConfig.LocalTime,
  39. Compress: backend.FileConfig.RotateConfig.Compress,
  40. }
  41. } else {
  42. var err error
  43. iof, err = os.OpenFile(backend.FileConfig.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
  44. if err != nil {
  45. return nil, err
  46. }
  47. }
  48. if backend.FileConfig.FVConsole {
  49. return NewSimpleConsoleBackend(iof), nil
  50. }
  51. return hiedabke_writer.NewHiedaBackendWriter(iof), nil
  52. }
  53. func (hyu *HiedaLogYamlUtil) parseAlislsBackend(backend CommonLogConfigYAML_Backend) (hiedalog.HiedaLogBackend, error) {
  54. if backend.AliSLSConfig == nil {
  55. return nil, fmt.Errorf("no field named 'alisls_config' for backend type 'alisls'")
  56. }
  57. bac := backend.AliSLSConfig
  58. var srcip string
  59. if bac.OverrideWithRealIP {
  60. rip, err := getInternetIP()
  61. if err != nil {
  62. srcip = bac.EmitIP
  63. } else {
  64. srcip = rip
  65. }
  66. } else {
  67. srcip = bac.EmitIP
  68. }
  69. alicfg := hiedabke_alisls.AliSLSConfig{
  70. DebugMode: bac.EnableAliSLSProducerDebug,
  71. AccessKeyID: bac.Appkey,
  72. AccessKeySecret: bac.Secret,
  73. Endpoint: bac.Endpoint,
  74. Project: bac.Project,
  75. Logstore: bac.Logstore,
  76. Topic: bac.Topic,
  77. Hostname: bac.Hostname,
  78. AppName: bac.AppName,
  79. SourceIP: srcip,
  80. }
  81. var aliextcfg *hiedabke_alisls.AliSLSConfigExtend
  82. if bac.ExtendAliSLSConfig == nil {
  83. aliextcfg = nil
  84. } else {
  85. aec := bac.ExtendAliSLSConfig
  86. aliextcfg = &hiedabke_alisls.AliSLSConfigExtend{
  87. TotalSizeLnBytes: aec.TotalSizeLnBytes,
  88. MaxIoWorkerCount: aec.MaxIoWorkerCount,
  89. MaxBlockSec: aec.MaxBlockSec,
  90. MaxBatchSize: aec.MaxBatchSize,
  91. MaxBatchCount: aec.MaxBatchCount,
  92. LingerMs: aec.LingerMs,
  93. Retries: aec.Retries,
  94. MaxReservedAttempts: aec.MaxReservedAttempts,
  95. BaseRetryBackoffMs: aec.BaseRetryBackoffMs,
  96. MaxRetryBackoffMs: aec.MaxRetryBackoffMs,
  97. AdjustShargHash: aec.AdjustShargHash,
  98. Buckets: aec.Buckets,
  99. AllowLogLevel: aec.AllowLogLevel,
  100. LogFileName: aec.LogFileName,
  101. IsJsonType: aec.IsJsonType,
  102. LogMaxSize: aec.LogMaxSize,
  103. LogMaxBackups: aec.LogMaxBackups,
  104. LogCompress: aec.LogCompress,
  105. NoRetryStatusCodeList: aec.NoRetryStatusCodeList,
  106. }
  107. }
  108. ah := hiedabke_alisls.NewHiedaBackendAliSLS(alicfg, aliextcfg)
  109. hyu.alisls_bknlist = append(hyu.alisls_bknlist, ah)
  110. return ah, nil
  111. }
  112. func getInternetIP() (string, error) {
  113. return "", fmt.Errorf("not supported yet")
  114. }
  115. type HiedaLogYamlUtil struct {
  116. alisls_bknlist []*hiedabke_alisls.HiedaBackendAliSLS
  117. Logger *hiedalog.HiedaLogger
  118. AddedBackends map[string]hiedalog.HiedaLogBackend
  119. }
  120. func (hyu *HiedaLogYamlUtil) StartAliSLS() {
  121. for _, v := range hyu.alisls_bknlist {
  122. v.StartProducer()
  123. }
  124. }
  125. func (hyu *HiedaLogYamlUtil) SafeShutdown() {
  126. for _, v := range hyu.alisls_bknlist {
  127. v.SafeStopProducer()
  128. }
  129. }
  130. func (hyu *HiedaLogYamlUtil) Shutdown(timeout_ms int64) error {
  131. for _, v := range hyu.alisls_bknlist {
  132. err := v.StopProducer(timeout_ms)
  133. if err != nil {
  134. return err
  135. }
  136. }
  137. return nil
  138. }
  139. type addInfo struct {
  140. Name string
  141. Backend hiedalog.HiedaLogBackend
  142. Level uint8
  143. }
  144. func CreateHiedaLoggerFromYAMLData(cfgdata CommonLogConfigYAML, autoStartAliSLS bool) (*HiedaLogYamlUtil, error) {
  145. hyu := &HiedaLogYamlUtil{
  146. Logger: hiedalog.NewHiedaLogger(),
  147. alisls_bknlist: make([]*hiedabke_alisls.HiedaBackendAliSLS, 0),
  148. AddedBackends: make(map[string]hiedalog.HiedaLogBackend),
  149. }
  150. if cfgdata.Enable {
  151. if cfgdata.Backends != nil {
  152. for k, v := range cfgdata.Backends {
  153. lvi := hyu.Logger.LevelFilter.NameToID(v.Level)
  154. if lvi == 7 {
  155. return nil, fmt.Errorf("unsupported log level '%s' in backend '%s'", v.Level, k)
  156. }
  157. var cins hiedalog.HiedaLogBackend
  158. var err error
  159. switch v.Type {
  160. case "console":
  161. cins, err = hyu.parseConsoleBackend(v)
  162. case "file":
  163. cins, err = hyu.parseFileBackend(v)
  164. case "alisls":
  165. cins, err = hyu.parseAlislsBackend(v)
  166. default:
  167. return nil, fmt.Errorf("unsupported log backend type '%s' in backend '%s'", v.Type, k)
  168. }
  169. if err != nil {
  170. return nil, err
  171. }
  172. hyu.Logger.AddBackend(cins, lvi)
  173. hyu.AddedBackends[k] = cins
  174. }
  175. }
  176. }
  177. if autoStartAliSLS {
  178. hyu.StartAliSLS()
  179. }
  180. return hyu, nil
  181. }
  182. func AddBackendsFromYAMLDataWithExistedLogger(logger *hiedalog.HiedaLogger, cfgdata CommonLogConfigYAML, autoStartAliSLS bool, clearExistBackends bool) (*HiedaLogYamlUtil, error) {
  183. hyu := &HiedaLogYamlUtil{
  184. Logger: logger,
  185. alisls_bknlist: make([]*hiedabke_alisls.HiedaBackendAliSLS, 0),
  186. AddedBackends: make(map[string]hiedalog.HiedaLogBackend),
  187. }
  188. if cfgdata.Enable {
  189. if cfgdata.Backends != nil {
  190. addlist := make([]*addInfo, 0)
  191. for k, v := range cfgdata.Backends {
  192. lvi := hyu.Logger.LevelFilter.NameToID(v.Level)
  193. if lvi == 7 {
  194. return nil, fmt.Errorf("unsupported log level '%s' in backend '%s'", v.Level, k)
  195. }
  196. var cins hiedalog.HiedaLogBackend
  197. var err error
  198. switch v.Type {
  199. case "console":
  200. cins, err = hyu.parseConsoleBackend(v)
  201. case "file":
  202. cins, err = hyu.parseFileBackend(v)
  203. case "alisls":
  204. cins, err = hyu.parseAlislsBackend(v)
  205. default:
  206. return nil, fmt.Errorf("unsupported log backend type '%s' in backend '%s'", v.Type, k)
  207. }
  208. if err != nil {
  209. return nil, err
  210. }
  211. addlist = append(addlist, &addInfo{
  212. Name: k,
  213. Backend: cins,
  214. Level: lvi,
  215. })
  216. }
  217. if clearExistBackends {
  218. hyu.Logger.BackendConfigs = make([]hiedalog.HiedaLogBackendConfig, 0)
  219. }
  220. for _, v := range addlist {
  221. hyu.Logger.AddBackend(v.Backend, v.Level)
  222. hyu.AddedBackends[v.Name] = v.Backend
  223. }
  224. }
  225. }
  226. if autoStartAliSLS {
  227. hyu.StartAliSLS()
  228. }
  229. return hyu, nil
  230. }