From fc65714d0122f96705a0dbf55b304ca7b93f5774 Mon Sep 17 00:00:00 2001 From: Krishna Upadhyaya Date: Tue, 21 Feb 2023 19:13:50 +0530 Subject: [PATCH] Added logs_writer flag --- bridge/setu/util/common.go | 4 +-- cmd/heimdalld/service/service.go | 31 ++++++++++++++++ helper/config.go | 62 +++++++++++++++++++++++++------- server/root.go | 6 ++-- 4 files changed, 86 insertions(+), 17 deletions(-) diff --git a/bridge/setu/util/common.go b/bridge/setu/util/common.go index 2a94ea63e..db0365942 100644 --- a/bridge/setu/util/common.go +++ b/bridge/setu/util/common.go @@ -8,7 +8,6 @@ import ( "io/ioutil" "net/http" "net/url" - "os" "strconv" "sync" "time" @@ -86,7 +85,8 @@ var loggerOnce sync.Once func Logger() log.Logger { loggerOnce.Do(func() { defaultLevel := "info" - logger = log.NewTMLogger(log.NewSyncWriter(os.Stdout)) + logsWriter := helper.GetLogsWriter(helper.GetConfig().LogsWriterFile) + logger = log.NewTMLogger(log.NewSyncWriter(logsWriter)) option, err := log.AllowLevel(viper.GetString("log_level")) if err != nil { // cosmos sdk is using different style of log format diff --git a/cmd/heimdalld/service/service.go b/cmd/heimdalld/service/service.go index 2966ab14a..56f20cb4b 100644 --- a/cmd/heimdalld/service/service.go +++ b/cmd/heimdalld/service/service.go @@ -31,6 +31,7 @@ import ( "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/secp256k1" "github.com/tendermint/tendermint/libs/cli" + tmflags "github.com/tendermint/tendermint/libs/cli/flags" "github.com/tendermint/tendermint/libs/common" "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/node" @@ -249,6 +250,19 @@ For profiling and benchmarking purposes, CPU profiling can be enabled via the '- which accepts a path for the resulting pprof file. `, RunE: func(cmd *cobra.Command, args []string) error { + LogsWriterFile := viper.GetString(helper.LogsWriterFileFlag) + if LogsWriterFile != "" { + logWriter := helper.GetLogsWriter(LogsWriterFile) + + logger, err := SetupCtxLogger(logWriter, ctx.Config.LogLevel) + if err != nil { + logger.Error("Unable to setup logger", "err", err) + return err + } + + ctx.Logger = logger + } + ctx.Logger.Info("starting ABCI with Tendermint") startRestServer, _ := cmd.Flags().GetBool(helper.RestServerFlag) @@ -754,3 +768,20 @@ func CryptoKeyToPubkey(key crypto.PubKey) hmTypes.PubKey { validatorPublicKey := helper.GetPubObjects(key) return hmTypes.NewPubKey(validatorPublicKey[:]) } + +func SetupCtxLogger(logWriter io.Writer, logLevel string) (log.Logger, error) { + logger := log.NewTMLogger(log.NewSyncWriter(logWriter)) + + logger, err := tmflags.ParseLogLevel(logLevel, logger, cfg.DefaultLogLevel()) + if err != nil { + return nil, err + } + + if viper.GetBool(cli.TraceFlag) { + logger = log.NewTracingLogger(logger) + } + + logger = logger.With("module", "main") + + return logger, nil +} diff --git a/helper/config.go b/helper/config.go index 1d3c7da63..b5f763ed7 100644 --- a/helper/config.go +++ b/helper/config.go @@ -3,6 +3,7 @@ package helper import ( "crypto/ecdsa" "fmt" + "io" "log" "math/big" "os" @@ -35,6 +36,7 @@ const ( RestServerFlag = "rest-server" BridgeFlag = "bridge" LogLevel = "log_level" + LogsWriterFileFlag = "logs_writer_file" SeedsFlag = "seeds" MainChain = "mainnet" @@ -172,8 +174,10 @@ type Configuration struct { // wait time related options NoACKWaitTime time.Duration `mapstructure:"no_ack_wait_time"` // Time ack service waits to clear buffer and elect new proposer - // json logging - LogsType string `mapstructure:"logs_type"` // if true, enable logging in json format + // Log related options + LogsType string `mapstructure:"logs_type"` // if true, enable logging in json format + LogsWriterFile string `mapstructure:"logs_writer_file"` // if given, Logs will be written to this file else os.Stdout + // current chain - newSelectionAlgoHeight depends on this Chain string `mapstructure:"chain"` } @@ -254,14 +258,6 @@ func InitHeimdallConfigWith(homeDir string, heimdallConfigFileFromFLag string) { log.Fatalln("Unable to unmarshall config", "Error", err) } - // perform check for json logging - if conf.LogsType == "json" { - Logger = logger.NewTMJSONLogger(logger.NewSyncWriter(os.Stdout)) - } else { - // default fallback - Logger = logger.NewTMLogger(logger.NewSyncWriter(os.Stdout)) - } - // if there is a file with overrides submitted via flags => read it an merge it with the alreadey read standard configuration if heimdallConfigFileFromFLag != "" { heimdallViperFromFlag := viper.New() @@ -286,6 +282,14 @@ func InitHeimdallConfigWith(homeDir string, heimdallConfigFileFromFLag string) { log.Fatalln("Unable to read flag values. Check log for details.", "Error", err) } + // perform check for json logging + if conf.LogsType == "json" { + Logger = logger.NewTMJSONLogger(logger.NewSyncWriter(GetLogsWriter(conf.LogsWriterFile))) + } else { + // default fallback + Logger = logger.NewTMLogger(logger.NewSyncWriter(GetLogsWriter(conf.LogsWriterFile))) + } + // perform checks for timeout if conf.EthRPCTimeout == 0 { // fallback to default @@ -389,8 +393,9 @@ func GetDefaultHeimdallConfig() Configuration { NoACKWaitTime: NoACKWaitTime, - LogsType: DefaultLogsType, - Chain: DefaultChain, + LogsType: DefaultLogsType, + Chain: DefaultChain, + LogsWriterFile: "", // default to stdout } } @@ -640,6 +645,17 @@ func DecorateWithHeimdallFlags(cmd *cobra.Command, v *viper.Viper, loggerInstanc if err := v.BindPFlag(ChainFlag, cmd.PersistentFlags().Lookup(ChainFlag)); err != nil { loggerInstance.Error(fmt.Sprintf("%v | BindPFlag | %v", caller, ChainFlag), "Error", err) } + + // add logsWriterFile flag + cmd.PersistentFlags().String( + LogsWriterFileFlag, + "", + "Set logs writer file, Default is os.Stdout", + ) + + if err := v.BindPFlag(LogsWriterFileFlag, cmd.PersistentFlags().Lookup(LogsWriterFileFlag)); err != nil { + loggerInstance.Error(fmt.Sprintf("%v | BindPFlag | %v", caller, LogsWriterFileFlag), "Error", err) + } } func (c *Configuration) UpdateWithFlags(v *viper.Viper, loggerInstance logger.Logger) error { @@ -750,6 +766,11 @@ func (c *Configuration) UpdateWithFlags(v *viper.Viper, loggerInstance logger.Lo c.Chain = stringConfgValue } + stringConfgValue = v.GetString(LogsWriterFileFlag) + if stringConfgValue != "" { + c.LogsWriterFile = stringConfgValue + } + return nil } @@ -809,6 +830,10 @@ func (c *Configuration) Merge(cc *Configuration) { if cc.Chain != "" { c.Chain = cc.Chain } + + if cc.LogsWriterFile != "" { + c.LogsWriterFile = cc.LogsWriterFile + } } // DecorateWithTendermintFlags creates tendermint flags for desired command and bind them to viper @@ -842,3 +867,16 @@ func UpdateTendermintConfig(tendermintConfig *cfg.Config, v *viper.Viper) { } } } + +func GetLogsWriter(logsWriterFile string) io.Writer { + if logsWriterFile != "" { + logWriter, err := os.OpenFile(logsWriterFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + log.Fatalf("error opening log writer file: %v", err) + } + + return logWriter + } else { + return os.Stdout + } +} diff --git a/server/root.go b/server/root.go index 305b6d53e..38840602b 100644 --- a/server/root.go +++ b/server/root.go @@ -5,7 +5,6 @@ import ( "fmt" "net" "net/http" - "os" "runtime/debug" "time" @@ -40,7 +39,8 @@ func StartRestServer(mainCtx ctx.Context, cdc *codec.Codec, registerRoutesFn fun // init vars for the Light Client Rest server cliCtx := context.NewCLIContext().WithCodec(cdc) router := mux.NewRouter() - logger := tmLog.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "rest-server") + logsWriter := helper.GetLogsWriter(helper.GetConfig().LogsWriterFile) + logger := tmLog.NewTMLogger(log.NewSyncWriter(logsWriter)).With("module", "rest-server") registerRoutesFn(cliCtx, router) @@ -77,7 +77,7 @@ func StartRestServer(mainCtx ctx.Context, cdc *codec.Codec, registerRoutesFn fun }) // Setup gRPC server - gRPCLogger := tmLog.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "gRPC-server") + gRPCLogger := tmLog.NewTMLogger(log.NewSyncWriter(logsWriter)).With("module", "gRPC-server") if err := gRPC.SetupGRPCServer(mainCtx, cdc, viper.GetString(FlagGrpcAddr), gRPCLogger); err != nil { return err }