|
@@ -0,0 +1,184 @@
|
|
|
+package hieda_yamlutil
|
|
|
+
|
|
|
+import "C"
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "git.swzry.com/zry/GoHiedaLogger/hiedabke_alisls"
|
|
|
+ "git.swzry.com/zry/GoHiedaLogger/hiedabke_writer"
|
|
|
+ "git.swzry.com/zry/GoHiedaLogger/hiedalog"
|
|
|
+ "gopkg.in/natefinch/lumberjack.v2"
|
|
|
+ "io"
|
|
|
+ "os"
|
|
|
+)
|
|
|
+
|
|
|
+func (hyu *HiedaLogYamlUtil) parseConsoleBackend(backend CommonLogConfigYAML_Backend) (hiedalog.HiedaLogBackend, error) {
|
|
|
+ if backend.ConsoleConfig == nil {
|
|
|
+ return nil, fmt.Errorf("no field named 'console_config' for backend type 'console'")
|
|
|
+ }
|
|
|
+ switch backend.ConsoleConfig.To {
|
|
|
+ case "stdout":
|
|
|
+ return NewSimpleConsoleBackend(os.Stdout), nil
|
|
|
+ case "stderr":
|
|
|
+ return NewSimpleConsoleBackend(os.Stderr), nil
|
|
|
+ default:
|
|
|
+ return nil, fmt.Errorf("invalid target '%s' for 'to' field of 'console_config'", backend.ConsoleConfig.To)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (hyu *HiedaLogYamlUtil) parseFileBackend(backend CommonLogConfigYAML_Backend) (hiedalog.HiedaLogBackend, error) {
|
|
|
+ if backend.FileConfig == nil {
|
|
|
+ return nil, fmt.Errorf("no field named 'file_config' for backend type 'file'")
|
|
|
+ }
|
|
|
+ var iof io.Writer
|
|
|
+ if backend.FileConfig.Rotate {
|
|
|
+ if backend.FileConfig.RotateConfig == nil {
|
|
|
+ return nil, fmt.Errorf("rotate enabled but no field named 'rotate_config'")
|
|
|
+ }
|
|
|
+ iof = &lumberjack.Logger{
|
|
|
+ Filename: backend.FileConfig.Filename,
|
|
|
+ MaxSize: backend.FileConfig.RotateConfig.MaxSize,
|
|
|
+ MaxAge: backend.FileConfig.RotateConfig.MaxAge,
|
|
|
+ MaxBackups: backend.FileConfig.RotateConfig.MaxBackups,
|
|
|
+ LocalTime: backend.FileConfig.RotateConfig.LocalTime,
|
|
|
+ Compress: backend.FileConfig.RotateConfig.Compress,
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ var err error
|
|
|
+ iof, err = os.OpenFile(backend.FileConfig.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if backend.FileConfig.FVConsole {
|
|
|
+ return NewSimpleConsoleBackend(iof), nil
|
|
|
+ }
|
|
|
+ return hiedabke_writer.NewHiedaBackendWriter(iof), nil
|
|
|
+}
|
|
|
+
|
|
|
+func (hyu *HiedaLogYamlUtil) parseAlislsBackend(backend CommonLogConfigYAML_Backend) (hiedalog.HiedaLogBackend, error) {
|
|
|
+ if backend.AliSLSConfig == nil {
|
|
|
+ return nil, fmt.Errorf("no field named 'alisls_config' for backend type 'alisls'")
|
|
|
+ }
|
|
|
+ bac := backend.AliSLSConfig
|
|
|
+ var srcip string
|
|
|
+ if bac.OverrideWithRealIP {
|
|
|
+ rip, err := getInternetIP()
|
|
|
+ if err != nil {
|
|
|
+ srcip = bac.EmitIP
|
|
|
+ } else {
|
|
|
+ srcip = rip
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ srcip = bac.EmitIP
|
|
|
+ }
|
|
|
+ alicfg := hiedabke_alisls.AliSLSConfig{
|
|
|
+ DebugMode: bac.EnableAliSLSProducerDebug,
|
|
|
+ AccessKeyID: bac.Appkey,
|
|
|
+ AccessKeySecret: bac.Secret,
|
|
|
+ Endpoint: bac.Endpoint,
|
|
|
+ Project: bac.Project,
|
|
|
+ Logstore: bac.Logstore,
|
|
|
+ Topic: bac.Topic,
|
|
|
+ Hostname: bac.Hostname,
|
|
|
+ AppName: bac.AppName,
|
|
|
+ SourceIP: srcip,
|
|
|
+ }
|
|
|
+ var aliextcfg *hiedabke_alisls.AliSLSConfigExtend
|
|
|
+ if bac.ExtendAliSLSConfig == nil {
|
|
|
+ aliextcfg = nil
|
|
|
+ } else {
|
|
|
+ aec := bac.ExtendAliSLSConfig
|
|
|
+ aliextcfg = &hiedabke_alisls.AliSLSConfigExtend{
|
|
|
+ TotalSizeLnBytes: aec.TotalSizeLnBytes,
|
|
|
+ MaxIoWorkerCount: aec.MaxIoWorkerCount,
|
|
|
+ MaxBlockSec: aec.MaxBlockSec,
|
|
|
+ MaxBatchSize: aec.MaxBatchSize,
|
|
|
+ MaxBatchCount: aec.MaxBatchCount,
|
|
|
+ LingerMs: aec.LingerMs,
|
|
|
+ Retries: aec.Retries,
|
|
|
+ MaxReservedAttempts: aec.MaxReservedAttempts,
|
|
|
+ BaseRetryBackoffMs: aec.BaseRetryBackoffMs,
|
|
|
+ MaxRetryBackoffMs: aec.MaxRetryBackoffMs,
|
|
|
+ AdjustShargHash: aec.AdjustShargHash,
|
|
|
+ Buckets: aec.Buckets,
|
|
|
+ AllowLogLevel: aec.AllowLogLevel,
|
|
|
+ LogFileName: aec.LogFileName,
|
|
|
+ IsJsonType: aec.IsJsonType,
|
|
|
+ LogMaxSize: aec.LogMaxSize,
|
|
|
+ LogMaxBackups: aec.LogMaxBackups,
|
|
|
+ LogCompress: aec.LogCompress,
|
|
|
+ NoRetryStatusCodeList: aec.NoRetryStatusCodeList,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ah := hiedabke_alisls.NewHiedaBackendAliSLS(alicfg, aliextcfg)
|
|
|
+ hyu.alisls_bknlist = append(hyu.alisls_bknlist, ah)
|
|
|
+ return ah, nil
|
|
|
+}
|
|
|
+
|
|
|
+func getInternetIP() (string, error) {
|
|
|
+ return "", fmt.Errorf("not supported yet")
|
|
|
+}
|
|
|
+
|
|
|
+type HiedaLogYamlUtil struct {
|
|
|
+ alisls_bknlist []*hiedabke_alisls.HiedaBackendAliSLS
|
|
|
+ Logger *hiedalog.HiedaLogger
|
|
|
+}
|
|
|
+
|
|
|
+func (hyu *HiedaLogYamlUtil) StartAliSLS() {
|
|
|
+ for _, v := range hyu.alisls_bknlist {
|
|
|
+ v.StartProducer()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (hyu *HiedaLogYamlUtil) SafeShutdown() {
|
|
|
+ for _, v := range hyu.alisls_bknlist {
|
|
|
+ v.SafeStopProducer()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (hyu *HiedaLogYamlUtil) Shutdown(timeout_ms int64) error {
|
|
|
+ for _, v := range hyu.alisls_bknlist {
|
|
|
+ err := v.StopProducer(timeout_ms)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func CreateHiedaLoggerFromYAMLData(cfgdata CommonLogConfigYAML, autoStartAliSLS bool) (*HiedaLogYamlUtil, error) {
|
|
|
+ hyu := &HiedaLogYamlUtil{
|
|
|
+ Logger: hiedalog.NewHiedaLogger(),
|
|
|
+ alisls_bknlist: make([]*hiedabke_alisls.HiedaBackendAliSLS, 0),
|
|
|
+ }
|
|
|
+ if cfgdata.Enable {
|
|
|
+ if cfgdata.Backends != nil {
|
|
|
+ for k, v := range cfgdata.Backends {
|
|
|
+ lvi := hyu.Logger.LevelFilter.NameToID(v.Level)
|
|
|
+ if lvi == 7 {
|
|
|
+ return nil, fmt.Errorf("unsupported log level '%s' in backend '%s'", v.Level, k)
|
|
|
+ }
|
|
|
+ var cins hiedalog.HiedaLogBackend
|
|
|
+ var err error
|
|
|
+ switch v.Type {
|
|
|
+ case "console":
|
|
|
+ cins, err = hyu.parseConsoleBackend(v)
|
|
|
+ case "file":
|
|
|
+ cins, err = hyu.parseFileBackend(v)
|
|
|
+ case "alisls":
|
|
|
+ cins, err = hyu.parseAlislsBackend(v)
|
|
|
+ default:
|
|
|
+ return nil, fmt.Errorf("unsupported log backend type '%s' in backend '%s'", v.Type, k)
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ hyu.Logger.AddBackend(cins, lvi)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if autoStartAliSLS {
|
|
|
+ hyu.StartAliSLS()
|
|
|
+ }
|
|
|
+ return hyu, nil
|
|
|
+}
|