re-wire logging on top of zerolog
Signed-off-by: Andrea Luzzardi <aluzzardi@gmail.com>
This commit is contained in:
@@ -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")
|
||||
}
|
||||
|
@@ -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")
|
||||
}
|
||||
}
|
||||
|
51
cmd/dagger/logger/logger.go
Normal file
51
cmd/dagger/logger/logger.go
Normal 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
|
||||
}
|
Reference in New Issue
Block a user