Skip to content

Commit

Permalink
Add JSON logger option (#829)
Browse files Browse the repository at this point in the history
* add flag to enable json output on logs
  • Loading branch information
emmanuelm41 committed Oct 8, 2021
1 parent ea4ad2f commit 6a18ad8
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 30 deletions.
7 changes: 7 additions & 0 deletions cmd/client/lib/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,12 @@ var (
Name: "port",
Usage: "Local (host:)port for constructed libp2p host to listen on",
}

// JsonFlag is the CLI flag for enabling JSON output for logger
JSONFlag = &cli.BoolFlag{
Name: "json",
Usage: "Set the output as json format",
}
)

// ClientFlags is a list of common flags for client creation
Expand All @@ -90,6 +96,7 @@ var ClientFlags = []cli.Flag{
InsecureFlag,
RelayFlag,
PortFlag,
JSONFlag,
}

// Create builds a client, and can be invoked from a cli action supplied
Expand Down
9 changes: 5 additions & 4 deletions cmd/client/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,14 +88,15 @@ func main() {

// Client loads randomness from a server
func Client(c *cli.Context) error {
// configure logging
_ = log.DefaultLogger()
var level int
if c.Bool(verboseFlag.Name) {
log.SetDefaultLogger(os.Stderr, log.LogDebug)
level = log.LogDebug
} else {
log.SetDefaultLogger(os.Stderr, log.LogInfo)
level = log.LogInfo
}

log.ConfigureDefaultLogger(os.Stderr, level, c.Bool(lib.JSONFlag.Name))

opts := []client.Option{}

if c.IsSet(clientMetricsIDFlag.Name) {
Expand Down
7 changes: 4 additions & 3 deletions cmd/drand-cli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,8 @@ var appCommands = []*cli.Command{
Usage: "Start the drand daemon.",
Flags: toArray(folderFlag, tlsCertFlag, tlsKeyFlag,
insecureFlag, controlFlag, privListenFlag, pubListenFlag, metricsFlag,
certsDirFlag, pushFlag, verboseFlag, enablePrivateRand, oldGroupFlag, skipValidationFlag),
certsDirFlag, pushFlag, verboseFlag, enablePrivateRand, oldGroupFlag,
skipValidationFlag, jsonFlag),
Action: func(c *cli.Context) error {
banner()
return startCmd(c)
Expand Down Expand Up @@ -725,9 +726,9 @@ func contextToConfig(c *cli.Context) *core.Config {
version := common.GetAppVersion()

if c.IsSet(verboseFlag.Name) {
opts = append(opts, core.WithLogLevel(log.LogDebug))
opts = append(opts, core.WithLogLevel(log.LogDebug, jsonFlag.Value))
} else {
opts = append(opts, core.WithLogLevel(log.LogInfo))
opts = append(opts, core.WithLogLevel(log.LogInfo, jsonFlag.Value))
}

if c.IsSet(pubListenFlag.Name) {
Expand Down
8 changes: 6 additions & 2 deletions core/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,9 +247,13 @@ func WithControlPort(port string) ConfigOption {
}

// WithLogLevel sets the logging verbosity to the given level.
func WithLogLevel(level int) ConfigOption {
func WithLogLevel(level int, jsonFormat bool) ConfigOption {
return func(d *Config) {
d.logger = log.NewLogger(nil, level)
if jsonFormat {
d.logger = log.NewJSONLogger(nil, level)
} else {
d.logger = log.NewLogger(nil, level)
}
}
}

Expand Down
4 changes: 2 additions & 2 deletions core/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ func BatchNewDrand(t *testing.T, n int, insecure bool, opts ...ConfigOption) (

confOptions = append(confOptions,
WithControlPort(ports[i]),
WithLogLevel(log.LogFatal))
WithLogLevel(log.LogFatal, false))
// add options in last so it overwrites the default
confOptions = append(confOptions, opts...)

Expand Down Expand Up @@ -421,7 +421,7 @@ func (d *DrandTestScenario) CheckPublicBeacon(nodeAddress string, newGroup bool)
// SetupNewNodes creates new additional nodes that can participate during the resharing
func (d *DrandTestScenario) SetupNewNodes(t *testing.T, newNodes int) []*MockNode {
newDrands, _, newDir, newCertPaths := BatchNewDrand(d.t, newNodes, false,
WithCallOption(grpc.WaitForReady(false)), WithLogLevel(log.LogDebug))
WithCallOption(grpc.WaitForReady(false)), WithLogLevel(log.LogDebug, false))
d.newCertPaths = newCertPaths
d.newDir = newDir
d.newNodes = make([]*MockNode, newNodes)
Expand Down
2 changes: 1 addition & 1 deletion demo/node/node_inprocess.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func (l *LocalNode) Start(certFolder string) error {
return err
}
opts := []core.ConfigOption{
core.WithLogLevel(log.LogDebug),
core.WithLogLevel(log.LogDebug, false),
core.WithConfigFolder(l.base),
core.WithTrustedCerts(certs...),
core.WithPublicListenAddress(l.pubAddr),
Expand Down
48 changes: 30 additions & 18 deletions log/log.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package log

import (
"os"
"sync"

"go.uber.org/zap"
"go.uber.org/zap/zapcore"
Expand Down Expand Up @@ -39,48 +38,61 @@ const (
// logger.
const DefaultLevel = LogInfo

var defaultLoggerSet sync.Once

// SetDefaultLogger updates the default logger to wrap a provided kit logger.
func SetDefaultLogger(output zapcore.WriteSyncer, level int) {
if output == nil {
output = os.Stdout
// ConfigureDefaultLogger updates the default logger to wrap a provided kit logger.
func ConfigureDefaultLogger(output zapcore.WriteSyncer, level int, jsonFormat bool) {
if jsonFormat {
zap.ReplaceGlobals(NewZapLogger(output, getJSONEncoder(), level))
} else {
zap.ReplaceGlobals(NewZapLogger(output, getConsoleEncoder(), level))
}

zap.ReplaceGlobals(NewZapLogger(output, level))
}

// DefaultLogger is the default logger that only logs at the `DefaultLevel`.
func DefaultLogger() Logger {
defaultLoggerSet.Do(func() {
SetDefaultLogger(nil, DefaultLevel)
})
if zap.S() == nil {
zap.ReplaceGlobals(NewZapLogger(nil, getConsoleEncoder(), DefaultLevel))
}

return zap.S()
}

// NewLogger returns a kit logger that prints statements at the given level.
func NewLogger(output zapcore.WriteSyncer, level int) Logger {
logger := NewZapLogger(output, level)
logger := NewZapLogger(output, getConsoleEncoder(), level)
return logger.Sugar()
}

// NewJSONLogger returns a kit logger that prints statements at the given level as JSON output.
func NewJSONLogger(output zapcore.WriteSyncer, level int) Logger {
logger := NewZapLogger(output, getJSONEncoder(), level)
return logger.Sugar()
}

func NewZapLogger(output zapcore.WriteSyncer, level int) *zap.Logger {
func NewZapLogger(output zapcore.WriteSyncer, encoder zapcore.Encoder, level int) *zap.Logger {
if output == nil {
output = os.Stdout
}

core := zapcore.NewCore(encoder, output, zapcore.Level(level))
logger := zap.New(core, zap.WithCaller(true))

return logger
}

func getJSONEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()

encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder

encoder := zapcore.NewConsoleEncoder(encoderConfig)
return zapcore.NewJSONEncoder(encoderConfig)
}

core := zapcore.NewCore(encoder, output, zapcore.Level(level))
func getConsoleEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()

logger := zap.New(core, zap.WithCaller(true))
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder

return logger
return zapcore.NewConsoleEncoder(encoderConfig)
}

0 comments on commit 6a18ad8

Please sign in to comment.