|
package main
|
|
|
|
import (
|
|
"context"
|
|
"mod-name/internal/service"
|
|
"mod-name/internal/tracing"
|
|
"os"
|
|
"os/signal"
|
|
"strings"
|
|
"sync"
|
|
"time"
|
|
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zapcore"
|
|
)
|
|
|
|
func initLogger(ctx context.Context, wg *sync.WaitGroup) (*zap.Logger, *zap.SugaredLogger, zap.AtomicLevel) {
|
|
wg.Add(1)
|
|
atom := zap.NewAtomicLevel()
|
|
|
|
// To keep the example deterministic, disable timestamps in the output.
|
|
encoderCfg := zap.NewDevelopmentEncoderConfig()
|
|
// encoderCfg.TimeKey = ""
|
|
encoderCfg.EncodeCaller = zapcore.ShortCallerEncoder
|
|
encoderCfg.EncodeLevel = zapcore.CapitalColorLevelEncoder
|
|
|
|
// // https://github.com/uber-go/zap/issues/661
|
|
// encoderCfg.EncodeTime = zapcore.TimeEncoder(func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
|
|
// enc.AppendString(t.Format(time.Stamp))
|
|
// // Aug 13 00:38:11
|
|
// })
|
|
|
|
// https://github.com/uber-go/zap/issues/661
|
|
encoderCfg.EncodeTime = zapcore.TimeEncoder(func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
|
|
enc.AppendString(strings.Fields(t.Format(time.StampMilli))[2])
|
|
// Aug 13 00:38:11
|
|
})
|
|
|
|
logger := zap.New(zapcore.NewCore(
|
|
zapcore.NewConsoleEncoder(encoderCfg),
|
|
zapcore.Lock(os.Stdout),
|
|
atom,
|
|
), zap.AddCaller())
|
|
go func() {
|
|
// logger.Info("Waiting for ending of programm...")
|
|
<-ctx.Done()
|
|
logger.Info("flush buffer of zap logger.")
|
|
logger.Sync() // flushes buffer, if any
|
|
wg.Done()
|
|
}()
|
|
|
|
sugar := logger.Sugar()
|
|
|
|
// sugar.Info("asdf")
|
|
// sugar.Debug("asdf")
|
|
// atom.SetLevel(zap.DebugLevel)
|
|
// sugar.Info("asdf")
|
|
// sugar.Debug("asdf")
|
|
// atom.SetLevel(zap.InfoLevel)
|
|
// sugar.Info("asdf")
|
|
return logger, sugar, atom
|
|
}
|
|
|
|
func printEnvs(sugar *zap.SugaredLogger) {
|
|
printEnv(sugar, "SERVICE_CONFIG")
|
|
printEnv(sugar, "env1")
|
|
printEnv(sugar, "env2")
|
|
printEnv(sugar, "LOGGING_LEVEL")
|
|
}
|
|
|
|
func printEnv(sugar *zap.SugaredLogger, envVarString string) {
|
|
envVar, existing := os.LookupEnv(envVarString)
|
|
if !existing {
|
|
sugar.Infof("env var '%v' is not set.", envVarString)
|
|
} else {
|
|
sugar.Infof("env var '%v' is set to '%v'", envVarString, envVar)
|
|
}
|
|
}
|
|
|
|
|
|
func main() {
|
|
// https://henvic.dev/posts/signal-notify-context/
|
|
// https://khanakia.medium.com/go-1-16-signal-notifycontext-fac21b3eaa1c
|
|
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
|
|
defer stop()
|
|
wg := new(sync.WaitGroup)
|
|
logger, sugar, atom := initLogger(ctx,wg)
|
|
// atom.SetLevel(zap.InfoLevel)
|
|
atom.SetLevel(zap.DebugLevel)
|
|
logger.Info("logger initialized.")
|
|
|
|
printEnvs(sugar)
|
|
loggingLevel, existing := os.LookupEnv("LOGGING_LEVEL")
|
|
if existing {
|
|
switch loggingLevel {
|
|
case "DEBUG":
|
|
sugar.Info("Set logging level to '%v'", loggingLevel)
|
|
atom.SetLevel(zap.DebugLevel)
|
|
|
|
case "INFO":
|
|
sugar.Infof("Set logging level to '%v'", loggingLevel)
|
|
atom.SetLevel(zap.InfoLevel)
|
|
default:
|
|
sugar.Fatalf("Don't know logging level '%v' at the moment", loggingLevel)
|
|
}
|
|
}
|
|
serviceConfigFilePath, existing := os.LookupEnv("SERVICE_CONFIG")
|
|
if !existing {
|
|
sugar.Fatalf("env var SERVICE_CONFIG is not set.")
|
|
}
|
|
|
|
s, err := service.NewService(ctx, stop, sugar, wg, serviceConfigFilePath)
|
|
if err != nil {
|
|
sugar.Fatal(err)
|
|
}
|
|
|
|
err = s.Start(ctx, stop, wg)
|
|
if err != nil {
|
|
sugar.Fatal(err)
|
|
}
|
|
// s.ProcessWorkload(wg, ctx)
|
|
|
|
wg.Wait()
|
|
sugar.Info("app was shutdown.")
|
|
}
|