From f6d1771a567f00675fefed7ee6c457f69f42c661 Mon Sep 17 00:00:00 2001 From: Marko Date: Mon, 12 Sep 2022 16:08:13 +0200 Subject: [PATCH] feat: bring back filter logging (#13236) * bring back filter logging * fix build * remove zerologger * add changelog entry & docs * fix lint --- CHANGELOG.md | 1 + docs/run-node/run-node.md | 12 +++++++ go.mod | 2 -- go.sum | 9 ----- server/cmd/execute.go | 3 +- server/logger.go | 55 ----------------------------- server/mock/helpers.go | 11 +----- server/util.go | 26 +++++++------- testutil/network/network.go | 9 +++-- x/upgrade/types/storeloader_test.go | 8 ++--- 10 files changed, 33 insertions(+), 103 deletions(-) delete mode 100644 server/logger.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 90c39d1075ef3..7b7b283d3bd4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -82,6 +82,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * [#12398](https://github.com/cosmos/cosmos-sdk/issues/12398) Refactor all `x` modules to unit-test via mocks and decouple `simapp`. * [#13144](https://github.com/cosmos/cosmos-sdk/pull/13144) Add validator distribution info grpc gateway get endpoint. * [#13168](https://github.com/cosmos/cosmos-sdk/pull/13168) Migrate tendermintdev/proto-builder to ghcr.io. New image `ghcr.io/cosmos/proto-builder:0.8` +* [#13236](https://github.com/cosmos/cosmos-sdk/pull/13236) Integrate Filter Logging ### State Machine Breaking diff --git a/docs/run-node/run-node.md b/docs/run-node/run-node.md index 9c7731d4660d7..64dc216fc2a34 100644 --- a/docs/run-node/run-node.md +++ b/docs/run-node/run-node.md @@ -123,6 +123,18 @@ The previous command allow you to run a single node. This is enough for the next The naive way would be to run the same commands again in separate terminal windows. This is possible, however in the Cosmos SDK, we leverage the power of [Docker Compose](https://docs.docker.com/compose/) to run a localnet. If you need inspiration on how to set up your own localnet with Docker Compose, you can have a look at the Cosmos SDK's [`docker-compose.yml`](https://github.com/cosmos/cosmos-sdk/blob/v0.46.0/docker-compose.yml). +## Logging + +Logging provides a way to see what is going on with a node. By default the info level is set. This is a global level and all info logs will be outputted to the terminal. If you would like to filter specific logs to the terminal instead of all, then setting `module:log_level` is how this can work. + +Example: + +In config.toml: + +```toml +log_level: "state:info,p2p:info,consensus:info,x/staking:info,x/ibc:info,*error" +``` + ## Next {hide} Read about the [Interacting with your Node](./interact-node.md) {hide} diff --git a/go.mod b/go.mod index 5d410007973db..4a176a860f4cc 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,6 @@ require ( github.com/prometheus/client_golang v1.13.0 github.com/prometheus/common v0.37.0 github.com/rakyll/statik v0.1.7 - github.com/rs/zerolog v1.28.0 github.com/spf13/cast v1.5.0 github.com/spf13/cobra v1.5.0 github.com/spf13/pflag v1.0.5 @@ -117,7 +116,6 @@ require ( github.com/klauspost/compress v1.15.9 // indirect github.com/lib/pq v1.10.6 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/highwayhash v1.0.2 // indirect diff --git a/go.sum b/go.sum index ed8037c68e79b..580c4aac7288f 100644 --- a/go.sum +++ b/go.sum @@ -177,7 +177,6 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.4 h1:n7C2ngKXo7UC9gNyMNLbzqz7Asuf+7Qv4gnX/rOdQ44= github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= @@ -306,7 +305,6 @@ github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869 h1:kRpU4zq+Pzh4feET49aEWPOzwQy3U2SsbZEQ7QEcif0= @@ -563,9 +561,6 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= @@ -724,9 +719,6 @@ github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XF github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= -github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -1068,7 +1060,6 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/server/cmd/execute.go b/server/cmd/execute.go index 2343388286033..fdc67341c6813 100644 --- a/server/cmd/execute.go +++ b/server/cmd/execute.go @@ -3,7 +3,6 @@ package cmd import ( "context" - "github.com/rs/zerolog" "github.com/spf13/cobra" tmcfg "github.com/tendermint/tendermint/config" tmcli "github.com/tendermint/tendermint/libs/cli" @@ -26,7 +25,7 @@ func Execute(rootCmd *cobra.Command, envPrefix string, defaultHome string) error // https://github.com/spf13/cobra/pull/1118. ctx := CreateExecuteContext(context.Background()) - rootCmd.PersistentFlags().String(flags.FlagLogLevel, zerolog.InfoLevel.String(), "The logging level (trace|debug|info|warn|error|fatal|panic)") + rootCmd.PersistentFlags().String(flags.FlagLogLevel, tmcfg.DefaultLogLevel, "The logging level (trace|debug|info|warn|error|fatal|panic)") rootCmd.PersistentFlags().String(flags.FlagLogFormat, tmcfg.LogFormatPlain, "The logging format (json|plain)") executor := tmcli.PrepareBaseCmd(rootCmd, envPrefix, defaultHome) diff --git a/server/logger.go b/server/logger.go deleted file mode 100644 index e6f6f8c1110f7..0000000000000 --- a/server/logger.go +++ /dev/null @@ -1,55 +0,0 @@ -package server - -import ( - "github.com/rs/zerolog" - tmlog "github.com/tendermint/tendermint/libs/log" -) - -var _ tmlog.Logger = (*ZeroLogWrapper)(nil) - -// ZeroLogWrapper provides a wrapper around a zerolog.Logger instance. It implements -// Tendermint's Logger interface. -type ZeroLogWrapper struct { - zerolog.Logger -} - -// Info implements Tendermint's Logger interface and logs with level INFO. A set -// of key/value tuples may be provided to add context to the log. The number of -// tuples must be even and the key of the tuple must be a string. -func (z ZeroLogWrapper) Info(msg string, keyVals ...interface{}) { - z.Logger.Info().Fields(getLogFields(keyVals...)).Msg(msg) -} - -// Error implements Tendermint's Logger interface and logs with level ERR. A set -// of key/value tuples may be provided to add context to the log. The number of -// tuples must be even and the key of the tuple must be a string. -func (z ZeroLogWrapper) Error(msg string, keyVals ...interface{}) { - z.Logger.Error().Fields(getLogFields(keyVals...)).Msg(msg) -} - -// Debug implements Tendermint's Logger interface and logs with level DEBUG. A set -// of key/value tuples may be provided to add context to the log. The number of -// tuples must be even and the key of the tuple must be a string. -func (z ZeroLogWrapper) Debug(msg string, keyVals ...interface{}) { - z.Logger.Debug().Fields(getLogFields(keyVals...)).Msg(msg) -} - -// With returns a new wrapped logger with additional context provided by a set -// of key/value tuples. The number of tuples must be even and the key of the -// tuple must be a string. -func (z ZeroLogWrapper) With(keyVals ...interface{}) tmlog.Logger { - return ZeroLogWrapper{z.Logger.With().Fields(getLogFields(keyVals...)).Logger()} -} - -func getLogFields(keyVals ...interface{}) map[string]interface{} { - if len(keyVals)%2 != 0 { - return nil - } - - fields := make(map[string]interface{}) - for i := 0; i < len(keyVals); i += 2 { - fields[keyVals[i].(string)] = keyVals[i+1] - } - - return fields -} diff --git a/server/mock/helpers.go b/server/mock/helpers.go index 9aa0ff61c1f92..aab1be7cff299 100644 --- a/server/mock/helpers.go +++ b/server/mock/helpers.go @@ -4,23 +4,14 @@ import ( "fmt" "os" - "github.com/rs/zerolog" abci "github.com/tendermint/tendermint/abci/types" tmlog "github.com/tendermint/tendermint/libs/log" - - "github.com/cosmos/cosmos-sdk/server" ) // SetupApp returns an application as well as a clean-up function // to be used to quickly setup a test case with an app func SetupApp() (abci.Application, func(), error) { - var logger tmlog.Logger - - logWriter := zerolog.ConsoleWriter{Out: os.Stderr} - logger = server.ZeroLogWrapper{ - Logger: zerolog.New(logWriter).Level(zerolog.InfoLevel).With().Timestamp().Logger(), - } - logger = logger.With("module", "mock") + logger := tmlog.NewTMLogger(tmlog.NewSyncWriter(os.Stdout)).With("module", "mock") rootDir, err := os.MkdirTemp("", "mock-sdk") if err != nil { diff --git a/server/util.go b/server/util.go index 4cd5aaf4fe9f8..0c6fb540898c5 100644 --- a/server/util.go +++ b/server/util.go @@ -14,14 +14,14 @@ import ( "syscall" "time" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" "github.com/spf13/cast" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/spf13/viper" tmcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" tmcfg "github.com/tendermint/tendermint/config" + tmcli "github.com/tendermint/tendermint/libs/cli" + tmflags "github.com/tendermint/tendermint/libs/cli/flags" tmlog "github.com/tendermint/tendermint/libs/log" dbm "github.com/tendermint/tm-db" @@ -58,7 +58,7 @@ func NewDefaultContext() *Context { return NewContext( viper.New(), tmcfg.DefaultConfig(), - ZeroLogWrapper{log.Logger}, + tmlog.NewTMLogger(tmlog.NewSyncWriter(os.Stdout)), ) } @@ -144,21 +144,19 @@ func InterceptConfigsPreRunHandler(cmd *cobra.Command, customAppConfigTemplate s if err = bindFlags(basename, cmd, serverCtx.Viper); err != nil { return err } - - var logWriter io.Writer - if strings.ToLower(serverCtx.Viper.GetString(flags.FlagLogFormat)) == tmcfg.LogFormatPlain { - logWriter = zerolog.ConsoleWriter{Out: os.Stderr} - } else { - logWriter = os.Stderr + logger := tmlog.NewTMLogger(tmlog.NewSyncWriter(os.Stdout)) + logger, err = tmflags.ParseLogLevel(config.LogLevel, logger, tmcfg.DefaultLogLevel) + if err != nil { + return err } - logLvlStr := serverCtx.Viper.GetString(flags.FlagLogLevel) - logLvl, err := zerolog.ParseLevel(logLvlStr) - if err != nil { - return fmt.Errorf("failed to parse log level (%s): %w", logLvlStr, err) + // Check if the tendermint flag for trace logging is set + // if it is then setup a tracing logger in this app as well + if serverCtx.Viper.GetBool(tmcli.TraceFlag) { + logger = tmlog.NewTracingLogger(logger) } - serverCtx.Logger = ZeroLogWrapper{zerolog.New(logWriter).Level(logLvl).With().Timestamp().Logger()} + serverCtx.Logger = logger.With("module", "main") return SetCmdServerContext(cmd, serverCtx) } diff --git a/testutil/network/network.go b/testutil/network/network.go index 9a6917b00ec2c..5bfd8dd5d300e 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -15,7 +15,6 @@ import ( "testing" "time" - "github.com/rs/zerolog" "github.com/spf13/cobra" tmrand "github.com/tendermint/tendermint/libs/rand" "github.com/tendermint/tendermint/node" @@ -26,7 +25,7 @@ import ( "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/testutil/configurator" "github.com/cosmos/cosmos-sdk/testutil/testdata" - moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" + tmlog "github.com/tendermint/tendermint/libs/log" "cosmossdk.io/depinject" "github.com/cosmos/cosmos-sdk/baseapp" @@ -45,6 +44,7 @@ import ( servertypes "github.com/cosmos/cosmos-sdk/server/types" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" + moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" _ "github.com/cosmos/cosmos-sdk/x/auth" _ "github.com/cosmos/cosmos-sdk/x/auth/tx/module" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -375,10 +375,9 @@ func New(l Logger, baseDir string, cfg Config) (*Network, error) { appCfg.GRPCWeb.Enable = true } - logger := server.ZeroLogWrapper{Logger: zerolog.Nop()} + logger := tmlog.NewNopLogger() if cfg.EnableTMLogging { - logWriter := zerolog.ConsoleWriter{Out: os.Stderr} - logger = server.ZeroLogWrapper{Logger: zerolog.New(logWriter).Level(zerolog.InfoLevel).With().Timestamp().Logger()} + logger = tmlog.NewTMLogger(tmlog.NewSyncWriter(os.Stdout)) } ctx.Logger = logger diff --git a/x/upgrade/types/storeloader_test.go b/x/upgrade/types/storeloader_test.go index 6aaefa69d198d..b392abef46d00 100644 --- a/x/upgrade/types/storeloader_test.go +++ b/x/upgrade/types/storeloader_test.go @@ -6,16 +6,15 @@ import ( "path/filepath" "testing" - "github.com/rs/zerolog" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" + tmlog "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" dbm "github.com/tendermint/tm-db" "github.com/cosmos/cosmos-sdk/baseapp" pruningtypes "github.com/cosmos/cosmos-sdk/pruning/types" - "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/store/rootmulti" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -28,10 +27,7 @@ func useUpgradeLoader(height int64, upgrades *storetypes.StoreUpgrades) func(*ba } func defaultLogger() log.Logger { - writer := zerolog.ConsoleWriter{Out: os.Stderr} - return server.ZeroLogWrapper{ - Logger: zerolog.New(writer).Level(zerolog.InfoLevel).With().Timestamp().Logger(), - } + return tmlog.NewTMLogger(tmlog.NewSyncWriter(os.Stdout)) } func initStore(t *testing.T, db dbm.DB, storeKey string, k, v []byte) {