re-wire logging on top of zerolog

Signed-off-by: Andrea Luzzardi <aluzzardi@gmail.com>
This commit is contained in:
Andrea Luzzardi
2021-01-13 17:38:16 -08:00
parent 49f0c0e149
commit e09723861f
19 changed files with 270 additions and 111 deletions

View File

@@ -1,37 +1,45 @@
package cmd
import (
"context"
"fmt"
"dagger.cloud/go/cmd/dagger/ui"
"dagger.cloud/go/cmd/dagger/logger"
"dagger.cloud/go/dagger"
"github.com/moby/buildkit/util/appcontext"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var computeCmd = &cobra.Command{
Use: "compute CONFIG",
Short: "Compute a configuration",
Args: cobra.ExactArgs(1),
PreRun: func(cmd *cobra.Command, args []string) {
// Fix Viper bug for duplicate flags:
// https://github.com/spf13/viper/issues/233
if err := viper.BindPFlags(cmd.Flags()); err != nil {
panic(err)
}
},
Run: func(cmd *cobra.Command, args []string) {
ctx := context.TODO()
lg := logger.New()
ctx := lg.WithContext(appcontext.Context())
// FIXME: boot and bootdir should be config fields, not args
c, err := dagger.NewClient(ctx, "", "", args[0])
if err != nil {
ui.FatalErr(err)
lg.Fatal().Err(err).Msg("unable to create client")
}
// FIXME: configure which config to compute (duh)
// FIXME: configure inputs
ui.Info("Running")
lg.Info().Msg("running")
output, err := c.Compute(ctx)
if err != nil {
ui.FatalErr(err)
lg.Fatal().Err(err).Msg("failed to compute")
}
ui.Info("Processing output")
lg.Info().Msg("processing output")
fmt.Println(output.JSON())
},
}
func init() {
// computeCmd.Flags().StringP("catalog", "c", "", "Cue package catalog")
}

View File

@@ -1,8 +1,11 @@
package cmd
import (
"dagger.cloud/go/cmd/dagger/ui"
"strings"
"dagger.cloud/go/cmd/dagger/logger"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var rootCmd = &cobra.Command{
@@ -11,9 +14,9 @@ var rootCmd = &cobra.Command{
}
func init() {
// --debug
rootCmd.PersistentFlags().Bool("debug", false, "Enable debug mode")
// --workspace
rootCmd.PersistentFlags().String("log-format", "", "Log format (json, pretty). Defaults to json if the terminal is not a tty")
rootCmd.PersistentFlags().StringP("log-level", "l", "debug", "Log level")
rootCmd.AddCommand(
computeCmd,
// Create an env
@@ -26,10 +29,19 @@ func init() {
// computeCmd,
// listCmd,
)
if err := viper.BindPFlags(rootCmd.PersistentFlags()); err != nil {
panic(err)
}
viper.SetEnvPrefix("dagger")
viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
viper.AutomaticEnv()
}
func Execute() {
lg := logger.New()
if err := rootCmd.Execute(); err != nil {
ui.FatalErr(err)
lg.Fatal().Err(err).Msg("failed to execute command")
}
}

View File

@@ -0,0 +1,51 @@
// Logger utilities for the CLI
//
// These utilities rely on command line flags to set up the logger, therefore
// they are tightly coupled with the CLI and should not be used outside.
package logger
import (
"fmt"
"os"
"github.com/rs/zerolog"
"github.com/spf13/viper"
"golang.org/x/term"
)
func New() zerolog.Logger {
logger := zerolog.
New(os.Stderr).
With().
Timestamp().
Logger()
if prettyLogs() {
logger = logger.Output(zerolog.ConsoleWriter{Out: os.Stderr})
} else {
logger = logger.With().Timestamp().Caller().Logger()
}
level := viper.GetString("log-level")
lvl, err := zerolog.ParseLevel(level)
if err != nil {
panic(err)
}
return logger.Level(lvl)
}
func prettyLogs() bool {
switch f := viper.GetString("log-format"); f {
case "json":
return false
case "pretty":
return true
case "":
return term.IsTerminal(int(os.Stdout.Fd()))
default:
fmt.Fprintf(os.Stderr, "invalid --log-format %q\n", f)
os.Exit(1)
}
return false
}