yamlutil.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package hieda_yamlutil
  2. import "C"
  3. import (
  4. "fmt"
  5. "git.swzry.com/zry/GoHiedaLogger/hiedabke_alisls"
  6. "git.swzry.com/zry/GoHiedaLogger/hiedabke_writer"
  7. "git.swzry.com/zry/GoHiedaLogger/hiedalog"
  8. "gopkg.in/natefinch/lumberjack.v2"
  9. "io"
  10. "os"
  11. )
  12. func (hyu *HiedaLogYamlUtil) parseConsoleBackend(backend CommonLogConfigYAML_Backend) (hiedalog.HiedaLogBackend, error) {
  13. if backend.ConsoleConfig == nil {
  14. return nil, fmt.Errorf("no field named 'console_config' for backend type 'console'")
  15. }
  16. switch backend.ConsoleConfig.To {
  17. case "stdout":
  18. return NewSimpleConsoleBackend(os.Stdout), nil
  19. case "stderr":
  20. return NewSimpleConsoleBackend(os.Stderr), nil
  21. default:
  22. return nil, fmt.Errorf("invalid target '%s' for 'to' field of 'console_config'", backend.ConsoleConfig.To)
  23. }
  24. }
  25. func (hyu *HiedaLogYamlUtil) parseFileBackend(backend CommonLogConfigYAML_Backend) (hiedalog.HiedaLogBackend, error) {
  26. if backend.FileConfig == nil {
  27. return nil, fmt.Errorf("no field named 'file_config' for backend type 'file'")
  28. }
  29. var iof io.Writer
  30. if backend.FileConfig.Rotate {
  31. if backend.FileConfig.RotateConfig == nil {
  32. return nil, fmt.Errorf("rotate enabled but no field named 'rotate_config'")
  33. }
  34. iof = &lumberjack.Logger{
  35. Filename: backend.FileConfig.Filename,
  36. MaxSize: backend.FileConfig.RotateConfig.MaxSize,
  37. MaxAge: backend.FileConfig.RotateConfig.MaxAge,
  38. MaxBackups: backend.FileConfig.RotateConfig.MaxBackups,
  39. LocalTime: backend.FileConfig.RotateConfig.LocalTime,
  40. Compress: backend.FileConfig.RotateConfig.Compress,
  41. }
  42. } else {
  43. var err error
  44. iof, err = os.OpenFile(backend.FileConfig.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
  45. if err != nil {
  46. return nil, err
  47. }
  48. }
  49. if backend.FileConfig.FVConsole {
  50. return NewSimpleConsoleBackend(iof), nil
  51. }
  52. return hiedabke_writer.NewHiedaBackendWriter(iof), nil
  53. }
  54. func (hyu *HiedaLogYamlUtil) parseAlislsBackend(backend CommonLogConfigYAML_Backend) (hiedalog.HiedaLogBackend, error) {
  55. if backend.AliSLSConfig == nil {
  56. return nil, fmt.Errorf("no field named 'alisls_config' for backend type 'alisls'")
  57. }
  58. bac := backend.AliSLSConfig
  59. var srcip string
  60. if bac.OverrideWithRealIP {
  61. rip, err := getInternetIP()
  62. if err != nil {
  63. srcip = bac.EmitIP
  64. } else {
  65. srcip = rip
  66. }
  67. } else {
  68. srcip = bac.EmitIP
  69. }
  70. alicfg := hiedabke_alisls.AliSLSConfig{
  71. DebugMode: bac.EnableAliSLSProducerDebug,
  72. AccessKeyID: bac.Appkey,
  73. AccessKeySecret: bac.Secret,
  74. Endpoint: bac.Endpoint,
  75. Project: bac.Project,
  76. Logstore: bac.Logstore,
  77. Topic: bac.Topic,
  78. Hostname: bac.Hostname,
  79. AppName: bac.AppName,
  80. SourceIP: srcip,
  81. }
  82. var aliextcfg *hiedabke_alisls.AliSLSConfigExtend
  83. if bac.ExtendAliSLSConfig == nil {
  84. aliextcfg = nil
  85. } else {
  86. aec := bac.ExtendAliSLSConfig
  87. aliextcfg = &hiedabke_alisls.AliSLSConfigExtend{
  88. TotalSizeLnBytes: aec.TotalSizeLnBytes,
  89. MaxIoWorkerCount: aec.MaxIoWorkerCount,
  90. MaxBlockSec: aec.MaxBlockSec,
  91. MaxBatchSize: aec.MaxBatchSize,
  92. MaxBatchCount: aec.MaxBatchCount,
  93. LingerMs: aec.LingerMs,
  94. Retries: aec.Retries,
  95. MaxReservedAttempts: aec.MaxReservedAttempts,
  96. BaseRetryBackoffMs: aec.BaseRetryBackoffMs,
  97. MaxRetryBackoffMs: aec.MaxRetryBackoffMs,
  98. AdjustShargHash: aec.AdjustShargHash,
  99. Buckets: aec.Buckets,
  100. AllowLogLevel: aec.AllowLogLevel,
  101. LogFileName: aec.LogFileName,
  102. IsJsonType: aec.IsJsonType,
  103. LogMaxSize: aec.LogMaxSize,
  104. LogMaxBackups: aec.LogMaxBackups,
  105. LogCompress: aec.LogCompress,
  106. NoRetryStatusCodeList: aec.NoRetryStatusCodeList,
  107. }
  108. }
  109. ah := hiedabke_alisls.NewHiedaBackendAliSLS(alicfg, aliextcfg)
  110. hyu.alisls_bknlist = append(hyu.alisls_bknlist, ah)
  111. return ah, nil
  112. }
  113. func getInternetIP() (string, error) {
  114. return "", fmt.Errorf("not supported yet")
  115. }
  116. type HiedaLogYamlUtil struct {
  117. alisls_bknlist []*hiedabke_alisls.HiedaBackendAliSLS
  118. Logger *hiedalog.HiedaLogger
  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. func CreateHiedaLoggerFromYAMLData(cfgdata CommonLogConfigYAML, autoStartAliSLS bool) (*HiedaLogYamlUtil, error) {
  140. hyu := &HiedaLogYamlUtil{
  141. Logger: hiedalog.NewHiedaLogger(),
  142. alisls_bknlist: make([]*hiedabke_alisls.HiedaBackendAliSLS, 0),
  143. }
  144. if cfgdata.Enable {
  145. if cfgdata.Backends != nil {
  146. for k, v := range cfgdata.Backends {
  147. lvi := hyu.Logger.LevelFilter.NameToID(v.Level)
  148. if lvi == 7 {
  149. return nil, fmt.Errorf("unsupported log level '%s' in backend '%s'", v.Level, k)
  150. }
  151. var cins hiedalog.HiedaLogBackend
  152. var err error
  153. switch v.Type {
  154. case "console":
  155. cins, err = hyu.parseConsoleBackend(v)
  156. case "file":
  157. cins, err = hyu.parseFileBackend(v)
  158. case "alisls":
  159. cins, err = hyu.parseAlislsBackend(v)
  160. default:
  161. return nil, fmt.Errorf("unsupported log backend type '%s' in backend '%s'", v.Type, k)
  162. }
  163. if err != nil {
  164. return nil, err
  165. }
  166. hyu.Logger.AddBackend(cins, lvi)
  167. }
  168. }
  169. }
  170. if autoStartAliSLS {
  171. hyu.StartAliSLS()
  172. }
  173. return hyu, nil
  174. }