config from env and log to file

This commit is contained in:
Aleksandr Trushkin
2024-02-26 13:32:24 +03:00
parent fd29ef6ff8
commit 5bcccd8aa7
3 changed files with 65 additions and 10 deletions

View File

@ -37,7 +37,12 @@ func GetRepository() (storage.Repository, error) {
}
func GetLogger() (zerolog.Logger, error) {
return do.Invoke[zerolog.Logger](diInjector)
log, err := do.Invoke[*loggerAdapter](diInjector)
if err != nil {
return zerolog.Nop(), err
}
return log.entity.log, nil
}
func GetDimensionMatcher() (*dimension.Matcher, error) {
@ -57,14 +62,34 @@ func SetupDI(ctx context.Context, cfgpath string, verbose bool, logAsJSON bool)
diInjector = do.New()
do.Provide(diInjector, func(i *do.Injector) (zerolog.Logger, error) {
do.Provide(diInjector, func(i *do.Injector) (*loggerAdapter, error) {
tsSet := func(wr *zerolog.ConsoleWriter) {
wr.TimeFormat = time.RFC3339
}
var writer io.Writer = zerolog.NewConsoleWriter(tsSet)
var outfile *os.File
var output io.Writer
switch cfg.Log.Output {
case "", "stdout":
output = os.Stdout
case "stderr":
output = os.Stderr
default:
outfile, err = os.Create(cfg.Log.Output)
if err != nil {
return nil, fmt.Errorf("creating file for logging: %w", err)
}
output = zerolog.SyncWriter(outfile)
}
var writer io.Writer
if logAsJSON {
writer = os.Stdout
writer = output
} else {
writer = zerolog.NewConsoleWriter(tsSet, func(w *zerolog.ConsoleWriter) {
w.Out = output
})
}
log := zerolog.
@ -73,12 +98,20 @@ func SetupDI(ctx context.Context, cfgpath string, verbose bool, logAsJSON bool)
Timestamp().
Str("app", "converter").
Logger()
if verbose {
return log.Level(zerolog.DebugLevel), nil
if verbose {
log = log.Level(zerolog.DebugLevel)
} else {
log = log.Level(zerolog.InfoLevel)
}
return log.Level(zerolog.InfoLevel), nil
out := &logger{
log: log,
underlyingFile: outfile,
}
return &loggerAdapter{
entity: out,
}, nil
})
do.Provide[eway.Client](diInjector, func(i *do.Injector) (eway.Client, error) {
@ -162,6 +195,19 @@ func parseSettings(cfgpath string) (cfg settings, err error) {
return cfg, nil
}
type logger struct {
log zerolog.Logger
underlyingFile *os.File
}
func (l *logger) Close() error {
if l.underlyingFile == nil {
return nil
}
return l.underlyingFile.Close()
}
type entityCloserAdapter[T io.Closer] struct {
entity T
}
@ -172,3 +218,4 @@ func (a entityCloserAdapter[T]) Shutdown() error {
type storageRepositoryAdapter entityCloserAdapter[storage.Repository]
type badgerDBAdapter entityCloserAdapter[*badger.DB]
type loggerAdapter entityCloserAdapter[*logger]

View File

@ -64,6 +64,10 @@ func setupDI() cli.BeforeFunc {
}
cfgpath := cmd.String("config")
if cfgpath == "" {
return errors.New("no config path provided")
}
debugLevel := cmd.Bool("verbose")
jsonFormat := cmd.Bool("json")
@ -99,6 +103,9 @@ func setupCLI() *cli.Command {
Name: "config",
Usage: "path to config in TOML format",
Value: "config.toml",
Sources: cli.NewValueSourceChain(
cli.EnvVar("EWAY_CONFIG"),
),
TakesFile: true,
},
&cli.BoolFlag{

View File

@ -52,4 +52,5 @@ func (l *LogFormat) UnmarshalText(data []byte) (err error) {
type Log struct {
Level string `json:"level" toml:"level"`
Format string `json:"format" toml:"format"`
Output string `json:"output" toml:"output"`
}