Skip to content

Commit

Permalink
feat: improve pretty logger
Browse files Browse the repository at this point in the history
Signed-off-by: DRAGON <anantvijay3@gmail.com>
  • Loading branch information
XDRAGON2002 committed Jul 31, 2023
1 parent 73139cf commit c4da14b
Show file tree
Hide file tree
Showing 8 changed files with 132 additions and 21 deletions.
4 changes: 3 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ module github.com/kubescape/go-logger
go 1.20

require (
github.com/briandowns/spinner v1.23.0
github.com/fatih/color v1.15.0
github.com/mattn/go-isatty v0.0.17
github.com/uptrace/opentelemetry-go-extra/otelzap v0.2.2
github.com/uptrace/uptrace-go v1.16.0
go.opentelemetry.io/otel v1.16.0
Expand All @@ -17,7 +19,6 @@ require (
github.com/golang/protobuf v1.5.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.17 // indirect
github.com/uptrace/opentelemetry-go-extra/otelutil v0.2.2 // indirect
go.opentelemetry.io/contrib/instrumentation/runtime v0.42.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect
Expand All @@ -35,6 +36,7 @@ require (
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/sys v0.8.0 // indirect
golang.org/x/term v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
google.golang.org/grpc v1.55.0 // indirect
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A=
github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE=
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
Expand Down Expand Up @@ -316,6 +318,8 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
Expand Down
3 changes: 3 additions & 0 deletions helpers/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ type ILogger interface {
Warning(msg string, details ...IDetails)
Info(msg string, details ...IDetails)
Debug(msg string, details ...IDetails)
Start(msg string, details ...IDetails)
StopSuccess(msg string, details ...IDetails)
StopError(msg string, details ...IDetails)

SetLevel(level string) error
GetLevel() string
Expand Down
27 changes: 15 additions & 12 deletions nonelogger/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,18 @@ func NewNoneLogger() *NoneLogger {
return &NoneLogger{}
}

func (nl *NoneLogger) GetLevel() string { return "" }
func (nl *NoneLogger) Ctx(_ context.Context) helpers.ILogger { return nl }
func (nl *NoneLogger) LoggerName() string { return LoggerName }
func (nl *NoneLogger) SetWriter(w *os.File) {}
func (nl *NoneLogger) GetWriter() *os.File { return nil }
func (nl *NoneLogger) SetLevel(level string) error { return nil }
func (nl *NoneLogger) Fatal(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) Error(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) Warning(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) Success(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) Info(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) Debug(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) GetLevel() string { return "" }
func (nl *NoneLogger) Ctx(_ context.Context) helpers.ILogger { return nl }
func (nl *NoneLogger) LoggerName() string { return LoggerName }
func (nl *NoneLogger) SetWriter(w *os.File) {}
func (nl *NoneLogger) GetWriter() *os.File { return nil }
func (nl *NoneLogger) SetLevel(level string) error { return nil }
func (nl *NoneLogger) Fatal(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) Error(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) Warning(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) Success(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) Info(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) Debug(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) Start(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) StopSuccess(msg string, details ...helpers.IDetails) {}
func (nl *NoneLogger) StopError(msg string, details ...helpers.IDetails) {}
44 changes: 36 additions & 8 deletions prettylogger/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,28 @@ import (
"os"
"sync"

spinnerpkg "github.com/briandowns/spinner"
"github.com/kubescape/go-logger/helpers"
)

const LoggerName string = "pretty"

type PrettyLogger struct {
writer *os.File
level helpers.Level
mutex sync.Mutex
writer *os.File
level helpers.Level
spinner *spinnerpkg.Spinner
mutex sync.Mutex
}

var _ helpers.ILogger = (*PrettyLogger)(nil) // ensure all interface methods are here

func NewPrettyLogger() *PrettyLogger {

return &PrettyLogger{
writer: os.Stderr, // default to stderr
level: helpers.InfoLevel,
mutex: sync.Mutex{},
writer: os.Stderr, // default to stderr
level: helpers.InfoLevel,
spinner: nil,
mutex: sync.Mutex{},
}
}

Expand Down Expand Up @@ -60,18 +63,28 @@ func (pl *PrettyLogger) Debug(msg string, details ...helpers.IDetails) {
func (pl *PrettyLogger) Success(msg string, details ...helpers.IDetails) {
pl.print(helpers.SuccessLevel, msg, details...)
}
func (pl *PrettyLogger) Start(msg string, details ...helpers.IDetails) {
pl.StartSpinner(pl.writer, msg)
}
func (pl *PrettyLogger) StopSuccess(msg string, details ...helpers.IDetails) {
pl.StopSpinner(getSymbol("success") + msg + "\n")
}
func (pl *PrettyLogger) StopError(msg string, details ...helpers.IDetails) {
pl.StopSpinner(getSymbol("error") + msg + "\n")
}

func (pl *PrettyLogger) print(level helpers.Level, msg string, details ...helpers.IDetails) {
pl.PauseSpinner()
if !level.Skip(pl.level) {
pl.mutex.Lock()
prefix(level)(pl.writer, "[%s] ", level.String())
prefix(level)(pl.writer, "%s", getSymbol(level.String()))
if d := detailsToString(details); d != "" {
msg = fmt.Sprintf("%s. %s", msg, d)
}
message(pl.writer, fmt.Sprintf("%s\n", msg))
pl.mutex.Unlock()
}

pl.ResumeSpinner()
}

func detailsToString(details []helpers.IDetails) string {
Expand All @@ -84,3 +97,18 @@ func detailsToString(details []helpers.IDetails) string {
}
return s
}

func getSymbol(level string) string {
switch level {
case "warning":
return "❗ "
case "success":
return "✔️ "
case "fatal", "error":
return "❌ "
case "debug":
return "— "
default:
return "〜 "
}
}
47 changes: 47 additions & 0 deletions prettylogger/spinner.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package prettylogger

import (
"os"
"time"

spinnerpkg "github.com/briandowns/spinner"
"github.com/mattn/go-isatty"
)

func (pl *PrettyLogger) StartSpinner(w *os.File, message string) {
pl.mutex.Lock()
if pl.spinner != nil && pl.spinner.Active() {
return
}
if isatty.IsTerminal(os.Stdout.Fd()) {
pl.spinner = spinnerpkg.New(spinnerpkg.CharSets[14], 100*time.Millisecond, spinnerpkg.WithWriterFile(w)) // Build our new spinner
pl.spinner.Suffix = " " + message
pl.spinner.Start()
}
pl.mutex.Unlock()
}

func (pl *PrettyLogger) StopSpinner(message string) {
pl.mutex.Lock()
if pl.spinner == nil || !pl.spinner.Active() {
return
}
pl.spinner.FinalMSG = message
pl.spinner.Stop()
pl.spinner = nil
pl.mutex.Unlock()
}

func (pl *PrettyLogger) PauseSpinner() {
if pl.spinner == nil || !pl.spinner.Active() {
return
}
pl.spinner.Stop()
}

func (pl *PrettyLogger) ResumeSpinner() {
if pl.spinner == nil || pl.spinner.Active() {
return
}
pl.spinner.Start()
}
12 changes: 12 additions & 0 deletions zaplogger/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,18 @@ func (zl *ZapLogger) Debug(msg string, details ...helpers.IDetails) {
zl.zapL.Debug(msg, detailsToZapFields(details)...)
}

func (zl *ZapLogger) Start(msg string, details ...helpers.IDetails) {
zl.zapL.Info(msg, detailsToZapFields(details)...)
}

func (zl *ZapLogger) StopSuccess(msg string, details ...helpers.IDetails) {
zl.zapL.Info(msg, detailsToZapFields(details)...)
}

func (zl *ZapLogger) StopError(msg string, details ...helpers.IDetails) {
zl.zapL.Info(msg, detailsToZapFields(details)...)
}

func detailsToZapFields(details []helpers.IDetails) []zapcore.Field {
zapFields := []zapcore.Field{}
for i := range details {
Expand Down
12 changes: 12 additions & 0 deletions zaplogger/loggerwithctx.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,15 @@ func (zl *ZapLoggerWithCtx) Debug(msg string, details ...helpers.IDetails) {
// calling ZapLogger() to get the underlying logger and not attach the log to the span
zl.zapL.ZapLogger().Debug(strings.ToValidUTF8(msg, helpers.InvalidUtf8ReplacementString), detailsToZapFields(details)...)
}

func (zl *ZapLoggerWithCtx) Start(msg string, details ...helpers.IDetails) {
zl.zapL.ZapLogger().Info(strings.ToValidUTF8(msg, helpers.InvalidUtf8ReplacementString), detailsToZapFields(details)...)
}

func (zl *ZapLoggerWithCtx) StopSuccess(msg string, details ...helpers.IDetails) {
zl.zapL.ZapLogger().Info(strings.ToValidUTF8(msg, helpers.InvalidUtf8ReplacementString), detailsToZapFields(details)...)
}

func (zl *ZapLoggerWithCtx) StopError(msg string, details ...helpers.IDetails) {
zl.zapL.ZapLogger().Info(strings.ToValidUTF8(msg, helpers.InvalidUtf8ReplacementString), detailsToZapFields(details)...)
}

0 comments on commit c4da14b

Please sign in to comment.