feat: verbose logging during upgrades (#24720)

Co-authored-by: Alex | Interchain Labs <alex@interchainlabs.io>
This commit is contained in:
Aaron Craelius
2025-05-13 20:48:30 +00:00
committed by GitHub
co-authored by Alex | Interchain Labs
parent 3d777ad46a
commit be955efe25
27 changed files with 364 additions and 34 deletions
+1
View File
@@ -29,6 +29,7 @@ func Execute(rootCmd *cobra.Command, envPrefix, defaultHome string) error {
// NOTE: The default logger is only checking for the "json" value, any other value will default to plain text.
rootCmd.PersistentFlags().String(flags.FlagLogFormat, "plain", "The logging format (json|plain)")
rootCmd.PersistentFlags().Bool(flags.FlagLogNoColor, false, "Disable colored logs")
rootCmd.PersistentFlags().String(flags.FlagVerboseLogLevel, zerolog.DebugLevel.String(), "The logging level (trace|debug|info|warn|error|fatal|panic|disabled|none) to use when performing operations which require extra verbosity (such as upgrades). When enabled, verbose mode disables any custom log filters. Set this to none to make verbose mode equivalent to normal logging.")
executor := cmtcli.PrepareBaseCmd(rootCmd, envPrefix, defaultHome)
return executor.ExecuteContext(ctx)
+17
View File
@@ -177,6 +177,15 @@ func CreateSDKLogger(ctx *Context, out io.Writer) (log.Logger, error) {
// We use CometBFT flag (cmtcli.TraceFlag) for trace logging.
log.TraceOption(ctx.Viper.GetBool(FlagTrace)))
verboseLogLevelStr := ctx.Viper.GetString(flags.FlagVerboseLogLevel)
if verboseLogLevelStr != "" {
verboseLogLvl, err := parseVerboseLogLevel(verboseLogLevelStr)
if err != nil {
return nil, fmt.Errorf("invalid verbose log level: %s: %w", verboseLogLevelStr, err)
}
opts = append(opts, log.VerboseLevelOption(verboseLogLvl))
}
// check and set filter level or keys for the logger if any
logLvlStr := ctx.Viper.GetString(flags.FlagLogLevel)
if logLvlStr == "" {
@@ -200,6 +209,14 @@ func CreateSDKLogger(ctx *Context, out io.Writer) (log.Logger, error) {
return log.NewLogger(out, opts...), nil
}
// parseVerboseLogLevel parses the string "none" as zerolog.NoLevel and all other level strings using zerolog.ParseLevel.
func parseVerboseLogLevel(verboseLogLevelStr string) (zerolog.Level, error) {
if verboseLogLevelStr == "none" {
return zerolog.NoLevel, nil
}
return zerolog.ParseLevel(verboseLogLevelStr)
}
// GetServerContextFromCmd returns a Context from a command or an empty Context
// if it has not been set.
func GetServerContextFromCmd(cmd *cobra.Command) *Context {
+32
View File
@@ -0,0 +1,32 @@
package server
import (
"testing"
"github.com/rs/zerolog"
"github.com/stretchr/testify/require"
)
func TestParseVerboseLogLevel(t *testing.T) {
tt := []struct {
input string
expected zerolog.Level
}{
// mainly testing that none maps to NoLevel, but checking other cases too for sanity
{"none", zerolog.NoLevel},
{"debug", zerolog.DebugLevel},
{"info", zerolog.InfoLevel},
{"warn", zerolog.WarnLevel},
{"error", zerolog.ErrorLevel},
{"fatal", zerolog.FatalLevel},
{"panic", zerolog.PanicLevel},
{"trace", zerolog.TraceLevel},
{"disabled", zerolog.Disabled},
}
for _, tc := range tt {
lvl, err := parseVerboseLogLevel(tc.input)
require.NoError(t, err)
require.Equal(t, tc.expected, lvl)
}
}