config from env and log to file
This commit is contained in:
@ -37,7 +37,12 @@ func GetRepository() (storage.Repository, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetLogger() (zerolog.Logger, 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) {
|
func GetDimensionMatcher() (*dimension.Matcher, error) {
|
||||||
@ -57,14 +62,34 @@ func SetupDI(ctx context.Context, cfgpath string, verbose bool, logAsJSON bool)
|
|||||||
|
|
||||||
diInjector = do.New()
|
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) {
|
tsSet := func(wr *zerolog.ConsoleWriter) {
|
||||||
wr.TimeFormat = time.RFC3339
|
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 {
|
if logAsJSON {
|
||||||
writer = os.Stdout
|
writer = output
|
||||||
|
} else {
|
||||||
|
writer = zerolog.NewConsoleWriter(tsSet, func(w *zerolog.ConsoleWriter) {
|
||||||
|
w.Out = output
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
log := zerolog.
|
log := zerolog.
|
||||||
@ -73,12 +98,20 @@ func SetupDI(ctx context.Context, cfgpath string, verbose bool, logAsJSON bool)
|
|||||||
Timestamp().
|
Timestamp().
|
||||||
Str("app", "converter").
|
Str("app", "converter").
|
||||||
Logger()
|
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) {
|
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
|
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 {
|
type entityCloserAdapter[T io.Closer] struct {
|
||||||
entity T
|
entity T
|
||||||
}
|
}
|
||||||
@ -172,3 +218,4 @@ func (a entityCloserAdapter[T]) Shutdown() error {
|
|||||||
|
|
||||||
type storageRepositoryAdapter entityCloserAdapter[storage.Repository]
|
type storageRepositoryAdapter entityCloserAdapter[storage.Repository]
|
||||||
type badgerDBAdapter entityCloserAdapter[*badger.DB]
|
type badgerDBAdapter entityCloserAdapter[*badger.DB]
|
||||||
|
type loggerAdapter entityCloserAdapter[*logger]
|
||||||
|
|||||||
@ -64,6 +64,10 @@ func setupDI() cli.BeforeFunc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cfgpath := cmd.String("config")
|
cfgpath := cmd.String("config")
|
||||||
|
if cfgpath == "" {
|
||||||
|
return errors.New("no config path provided")
|
||||||
|
}
|
||||||
|
|
||||||
debugLevel := cmd.Bool("verbose")
|
debugLevel := cmd.Bool("verbose")
|
||||||
jsonFormat := cmd.Bool("json")
|
jsonFormat := cmd.Bool("json")
|
||||||
|
|
||||||
@ -96,9 +100,12 @@ func setupCLI() *cli.Command {
|
|||||||
Version: fmt.Sprintf("%s (%s) %s", rooteway.Version(), rooteway.Commit(), rooteway.BuildTime()),
|
Version: fmt.Sprintf("%s (%s) %s", rooteway.Version(), rooteway.Commit(), rooteway.BuildTime()),
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "config",
|
Name: "config",
|
||||||
Usage: "path to config in TOML format",
|
Usage: "path to config in TOML format",
|
||||||
Value: "config.toml",
|
Value: "config.toml",
|
||||||
|
Sources: cli.NewValueSourceChain(
|
||||||
|
cli.EnvVar("EWAY_CONFIG"),
|
||||||
|
),
|
||||||
TakesFile: true,
|
TakesFile: true,
|
||||||
},
|
},
|
||||||
&cli.BoolFlag{
|
&cli.BoolFlag{
|
||||||
|
|||||||
@ -52,4 +52,5 @@ func (l *LogFormat) UnmarshalText(data []byte) (err error) {
|
|||||||
type Log struct {
|
type Log struct {
|
||||||
Level string `json:"level" toml:"level"`
|
Level string `json:"level" toml:"level"`
|
||||||
Format string `json:"format" toml:"format"`
|
Format string `json:"format" toml:"format"`
|
||||||
|
Output string `json:"output" toml:"output"`
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user