diff --git a/.vscode/settings.json b/.vscode/settings.json index ec906d3..5725234 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -110,6 +110,7 @@ "wgan", "xname", "xpander", + "zapslog", "Zemlya", "Zeroable" ] diff --git a/go.mod b/go.mod index a251ef9..86832db 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,6 @@ require ( github.com/onsi/gomega v1.30.0 github.com/samber/lo v1.39.0 go.uber.org/zap v1.26.0 - gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect ) require ( @@ -30,10 +29,10 @@ require ( require ( github.com/go-logr/logr v1.3.0 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/natefinch/lumberjack v2.0.0+incompatible github.com/nicksnyder/go-i18n/v2 v2.3.0 github.com/pkg/errors v0.9.1 go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap/exp v0.2.0 golang.org/x/exp v0.0.0-20230321023759-10a507213a29 golang.org/x/net v0.17.0 // indirect golang.org/x/sys v0.14.0 // indirect diff --git a/go.sum b/go.sum index 47eb655..e9d2159 100644 --- a/go.sum +++ b/go.sum @@ -25,8 +25,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= -github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= github.com/nicksnyder/go-i18n/v2 v2.3.0 h1:2NPsCsNFCVd7i+Su0xYsBrIhS3bE2XMv5gNTft2O+PQ= github.com/nicksnyder/go-i18n/v2 v2.3.0/go.mod h1:nxYSZE9M0bf3Y70gPQjN9ha7XNHX7gMc814+6wVyEI4= github.com/onsi/ginkgo/v2 v2.13.2 h1:Bi2gGVkfn6gQcjNjZJVO8Gf0FHzMPf2phUei9tejVMs= @@ -53,6 +51,8 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.uber.org/zap/exp v0.2.0 h1:FtGenNNeCATRB3CmB/yEUnjEFeJWpB/pMcy7e2bKPYs= +go.uber.org/zap/exp v0.2.0/go.mod h1:t0gqAIdh1MfKv9EwN/dLwfZnJxe9ITAZN78HEWPFWDQ= golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= @@ -70,8 +70,6 @@ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/log/fields.go b/internal/log/fields.go deleted file mode 100644 index b7cff91..0000000 --- a/internal/log/fields.go +++ /dev/null @@ -1,23 +0,0 @@ -package log - -import ( - "go.uber.org/zap" -) - -// add new zap fields as and when they are required - -func String(key, val string) Field { - return zap.String(key, val) -} - -func Uint(key string, val uint) Field { - return zap.Uint(key, val) -} - -func Int(key string, val int) Field { - return zap.Int(key, val) -} - -func Float64(key string, val float64) Field { - return zap.Float64(key, val) -} diff --git a/internal/log/log-defs.go b/internal/log/log-defs.go deleted file mode 100644 index f13629b..0000000 --- a/internal/log/log-defs.go +++ /dev/null @@ -1,43 +0,0 @@ -package log - -import ( - "github.com/snivilised/extendio/xfs/utils" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" -) - -type Field = zap.Field -type Level = zapcore.Level - -const ( - DebugLevel = zapcore.DebugLevel - InfoLevel = zapcore.InfoLevel - WarnLevel = zapcore.WarnLevel - ErrorLevel = zapcore.ErrorLevel -) - -type Logger interface { - Debug(msg string, fields ...Field) - Info(msg string, fields ...Field) - Warn(msg string, fields ...Field) - Error(msg string, fields ...Field) - Sync() error -} - -type Ref utils.RoProp[Logger] - -type Rotation struct { - Filename string - MaxSizeInMb int - MaxNoOfBackups int - MaxAgeInDays int -} - -type LoggerInfo struct { - Rotation - - Enabled bool - Path string - TimeStampFormat string - Level Level -} diff --git a/internal/log/new-logger.go b/internal/log/new-logger.go deleted file mode 100644 index 1b0c42a..0000000 --- a/internal/log/new-logger.go +++ /dev/null @@ -1,36 +0,0 @@ -package log - -import ( - "github.com/natefinch/lumberjack" - "github.com/samber/lo" - "github.com/snivilised/extendio/xfs/utils" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" - - "github.com/snivilised/extendio/i18n" -) - -func NewLogger(info *LoggerInfo) Ref { - return utils.NewRoProp(lo.TernaryF(info.Enabled, - func() Logger { - if info.Path == "" { - panic(i18n.NewInvalidConfigEntryError(info.Path, "Store/Logging/Path")) - } - ws := zapcore.AddSync(&lumberjack.Logger{ - Filename: info.Path, - MaxSize: info.Rotation.MaxSizeInMb, - MaxBackups: info.Rotation.MaxNoOfBackups, - MaxAge: info.Rotation.MaxAgeInDays, - }) - config := zap.NewProductionEncoderConfig() - config.EncodeTime = zapcore.TimeEncoderOfLayout(info.TimeStampFormat) - core := zapcore.NewCore( - zapcore.NewJSONEncoder(config), - ws, - info.Level, - ) - return zap.New(core) - }, func() Logger { - return zap.NewNop() - })) -} diff --git a/xfs/nav/bootstrapper.go b/xfs/nav/bootstrapper.go index 9e8fcb7..0343d83 100644 --- a/xfs/nav/bootstrapper.go +++ b/xfs/nav/bootstrapper.go @@ -2,7 +2,6 @@ package nav import ( "github.com/snivilised/extendio/collections" - "github.com/snivilised/extendio/xfs/utils" ) type nullDetacher struct{} @@ -29,7 +28,7 @@ func (b *bootstrapper) init() { b.nc.ns = &NavigationState{ Filters: b.nc.frame.filters, Root: &b.nc.frame.root, - Logger: utils.NewRoProp[ClientLogger](b.nc.impl.logger()), + Logger: b.o.Monitor.Log, } } diff --git a/xfs/nav/helpers_test.go b/xfs/nav/helpers_test.go index 446ffb1..bc66f12 100644 --- a/xfs/nav/helpers_test.go +++ b/xfs/nav/helpers_test.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "io/fs" + "log/slog" "math" "os" "path/filepath" @@ -14,7 +15,6 @@ import ( "github.com/samber/lo" "github.com/snivilised/extendio/i18n" "github.com/snivilised/extendio/internal/helpers" - "github.com/snivilised/extendio/internal/log" "github.com/snivilised/extendio/xfs/nav" "github.com/snivilised/extendio/xfs/utils" ) @@ -114,7 +114,6 @@ type resumeTE struct { active activeTE clientListenAt string profile string - log bool } type cascadeTE struct { @@ -144,26 +143,13 @@ func musico() string { panic("could not get root path") } -func logo() nav.LoggingOptions { - return nav.LoggingOptions{ - Enabled: true, - Path: helpers.Log(), - TimeStampFormat: "2006-01-02 15:04:05", - Rotation: nav.LogRotationOptions{ - MaxSizeInMb: 5, - MaxNoOfBackups: 1, - MaxAgeInDays: 7, - }, - } -} - func begin(em string) nav.BeginHandler { return func(state *nav.NavigationState) { - state.Logger.Get().Info("💧 Beginning Traversal (client side)", - log.String("Root", state.Root.Get()), - log.Uint("Foo", 42), - log.Int("Bar", 13), - log.Float64("Pi", float64(math.Pi)), + state.Logger.Info("💧 Beginning Traversal (client side)", + slog.String("Root", state.Root.Get()), + slog.Int("Foo", 42), + slog.Int("Bar", 13), + slog.Float64("Pi", float64(math.Pi)), ) GinkgoWriter.Printf( diff --git a/xfs/nav/navigation-controller.go b/xfs/nav/navigation-controller.go index 54c28b3..77d2b28 100644 --- a/xfs/nav/navigation-controller.go +++ b/xfs/nav/navigation-controller.go @@ -2,9 +2,9 @@ package nav import ( "context" + "log/slog" "github.com/samber/lo" - "github.com/snivilised/extendio/internal/log" "github.com/snivilised/extendio/xfs/utils" ) @@ -33,12 +33,12 @@ func (nc *navigationController) init() { nc.ns = &NavigationState{ Filters: nc.frame.filters, Root: &nc.frame.root, - Logger: utils.NewRoProp[ClientLogger](nc.impl.logger()), + Logger: nc.logger(), } nc.impl.init(nc.ns) } -func (nc *navigationController) logger() log.Logger { +func (nc *navigationController) logger() *slog.Logger { return nc.impl.logger() } @@ -48,15 +48,15 @@ func (nc *navigationController) ensync(ctx context.Context, cancel context.Cance func (nc *navigationController) walk(root string) (*TraverseResult, error) { nc.frame.root.Set(root) - nc.impl.logger().Info("walk", log.String("root", root)) + nc.impl.logger().Info("walk", slog.String("root", root)) nc.frame.notifiers.begin.invoke(nc.ns) result, err := nc.impl.top(nc.frame, root) - fields := []log.Field{} + fields := []any{} for _, m := range result.Metrics.collection { - fields = append(fields, log.Uint(m.Name, m.Count)) + fields = append(fields, slog.Int(m.Name, int(m.Count))) } nc.impl.logger().Info("Result", fields...) diff --git a/xfs/nav/navigation-listener_test.go b/xfs/nav/navigation-listener_test.go index 875e4c4..9420bcb 100644 --- a/xfs/nav/navigation-listener_test.go +++ b/xfs/nav/navigation-listener_test.go @@ -322,7 +322,6 @@ var _ = Describe("Listener", Ordered, func() { return nil }, } - o.Store.Logging = logo() } }) diff --git a/xfs/nav/navigator-abstract.go b/xfs/nav/navigator-abstract.go index e9e28ff..eefad4d 100644 --- a/xfs/nav/navigator-abstract.go +++ b/xfs/nav/navigator-abstract.go @@ -4,17 +4,15 @@ import ( "context" "fmt" "io/fs" + "log/slog" "strings" "github.com/google/uuid" - "github.com/snivilised/extendio/internal/log" - "github.com/snivilised/extendio/xfs/utils" ) type navigator struct { o *TraverseOptions agent *navigationAgent - log utils.RoProp[log.Logger] samplingActive bool filteringActive bool samplingFilterActive bool @@ -57,7 +55,7 @@ func (n *navigator) ensync( if err, ok := pe.(error); ok || strings.Contains(err.Error(), "send on closed channel") { n.logger().Error("☠️☠️☠️ send on closed channel", - log.String("item-path", item.Path), + slog.String("item-path", item.Path), ) } else { panic(pe) @@ -98,8 +96,8 @@ func (n *navigator) ensync( frame.decorate("boost decorator", decorator) } -func (n *navigator) logger() log.Logger { - return n.log.Get() +func (n *navigator) logger() *slog.Logger { + return n.o.Monitor.Log } func (n *navigator) descend(navi *NavigationInfo) bool { @@ -120,7 +118,7 @@ func (n *navigator) ascend(navi *NavigationInfo, permit bool) { } func (n *navigator) finish() error { - return n.log.Get().Sync() + return nil } func (n *navigator) keep(stash *inspection) { diff --git a/xfs/nav/new-navigator.go b/xfs/nav/new-navigator.go index 7d5c8f5..3183187 100644 --- a/xfs/nav/new-navigator.go +++ b/xfs/nav/new-navigator.go @@ -1,9 +1,6 @@ package nav import ( - "github.com/snivilised/extendio/internal/log" - "github.com/snivilised/extendio/xfs/utils" - "github.com/snivilised/extendio/i18n" ) @@ -57,11 +54,9 @@ func (f navigatorImplFactory) new(o *TraverseOptions) navigatorImpl { handler: ¬ifyCallbackErrorHandler{}, samplingFilterActive: samplingFilterActive, }) - logger = f.makeLogger(o) - n = navigator{ + n = navigator{ o: o, agent: agent, - log: logger, samplingActive: samplingActive, filteringActive: filteringActive, samplingFilterActive: samplingFilterActive, @@ -89,18 +84,3 @@ func (f navigatorImplFactory) new(o *TraverseOptions) navigatorImpl { return impl } - -func (f navigatorImplFactory) makeLogger(o *TraverseOptions) utils.RoProp[log.Logger] { - return log.NewLogger(&log.LoggerInfo{ - Rotation: log.Rotation{ - Filename: o.Store.Logging.Path, - MaxSizeInMb: o.Store.Logging.Rotation.MaxSizeInMb, - MaxNoOfBackups: o.Store.Logging.Rotation.MaxNoOfBackups, - MaxAgeInDays: o.Store.Logging.Rotation.MaxAgeInDays, - }, - Enabled: o.Store.Logging.Enabled, - Path: o.Store.Logging.Path, - TimeStampFormat: o.Store.Logging.TimeStampFormat, - Level: o.Store.Logging.Level, - }) -} diff --git a/xfs/nav/resume-strategy-fastward.go b/xfs/nav/resume-strategy-fastward.go index 6c10192..0b7dd91 100644 --- a/xfs/nav/resume-strategy-fastward.go +++ b/xfs/nav/resume-strategy-fastward.go @@ -2,8 +2,7 @@ package nav import ( "fmt" - - "github.com/snivilised/extendio/internal/log" + "log/slog" ) type fastwardListener struct { @@ -41,7 +40,7 @@ type fastwardStrategy struct { } func (s *fastwardStrategy) init(params *strategyInitParams) { - s.nc.logger().Info("fastward resume", log.String("path", params.ps.Active.Root)) + s.nc.logger().Info("fastward resume", slog.String("path", params.ps.Active.Root)) // this is the start we revert back to when we get back to the resume point // s.client.state = params.ps.Active.Listen @@ -101,8 +100,8 @@ func (s *fastwardStrategy) detach(frame *navigationFrame) { func (s *fastwardStrategy) resume(info *strategyResumeInfo) (*TraverseResult, error) { resumeAt := info.ps.Active.NodePath s.nc.logger().Info("fastward resume", - log.String("root-path", info.ps.Active.Root), - log.String("resume-at-path", resumeAt), + slog.String("root-path", info.ps.Active.Root), + slog.String("resume-at-path", resumeAt), ) // fast-forward doesn't need to restore the entire state, eg, the diff --git a/xfs/nav/resume-strategy-spawn.go b/xfs/nav/resume-strategy-spawn.go index e92f2b5..7629bc8 100644 --- a/xfs/nav/resume-strategy-spawn.go +++ b/xfs/nav/resume-strategy-spawn.go @@ -2,10 +2,10 @@ package nav import ( "io/fs" + "log/slog" "path/filepath" "github.com/samber/lo" - "github.com/snivilised/extendio/internal/log" "github.com/snivilised/extendio/xfs/utils" "github.com/snivilised/extendio/i18n" @@ -26,8 +26,8 @@ func (s *spawnStrategy) resume(info *strategyResumeInfo) (*TraverseResult, error resumeAt := s.ps.Active.NodePath s.nc.logger().Info("spawn resume", - log.String("root-path", info.ps.Active.Root), - log.String("resume-at-path", resumeAt), + slog.String("root-path", info.ps.Active.Root), + slog.String("resume-at-path", resumeAt), ) return s.conclude(&concludeInfo{ diff --git a/xfs/nav/resume-strategy_test.go b/xfs/nav/resume-strategy_test.go index dcbecf8..d3b389d 100644 --- a/xfs/nav/resume-strategy_test.go +++ b/xfs/nav/resume-strategy_test.go @@ -272,9 +272,6 @@ var _ = Describe("Resume", Ordered, func() { } } } - if entry.log { - o.Store.Logging = logo() - } } result, _ := nav.New().With(nav.RunnerWithResume, &nav.RunnerInfo{ @@ -334,7 +331,7 @@ var _ = Describe("Resume", Ordered, func() { Entry(nil, &resumeTE{ naviTE: naviTE{ - message: "universal: listen pending(logged)", + message: "universal: listen pending", relative: "RETRO-WAVE", subscription: nav.SubscribeAny, }, @@ -344,7 +341,6 @@ var _ = Describe("Resume", Ordered, func() { }, clientListenAt: StartAtElectricYouth, profile: "-> universal(pending): unfiltered", - log: true, }), Entry(nil, &resumeTE{ diff --git a/xfs/nav/traverse-defs.go b/xfs/nav/traverse-defs.go index 7c880c4..40bea7b 100644 --- a/xfs/nav/traverse-defs.go +++ b/xfs/nav/traverse-defs.go @@ -3,8 +3,8 @@ package nav import ( "context" "io/fs" + "log/slog" - "github.com/snivilised/extendio/internal/log" "github.com/snivilised/extendio/xfs/utils" ) @@ -169,7 +169,7 @@ type inspector interface { type navigatorImpl interface { inspector options() *TraverseOptions - logger() log.Logger + logger() *slog.Logger init(ns *NavigationState) ensync(ctx context.Context, cancel context.CancelFunc, frame *navigationFrame, ai *AsyncInfo) top(frame *navigationFrame, root string) (*TraverseResult, error) @@ -191,14 +191,6 @@ type SubPathInfo struct { Behaviour *SubPathBehaviour } -// ClientLogger -type ClientLogger interface { - Debug(_ string, _ ...log.Field) - Info(_ string, _ ...log.Field) - Warn(_ string, _ ...log.Field) - Error(_ string, _ ...log.Field) -} - type TriStateBoolEnum uint const ( diff --git a/xfs/nav/traverse-options.go b/xfs/nav/traverse-options.go index 3cabf3c..11254df 100644 --- a/xfs/nav/traverse-options.go +++ b/xfs/nav/traverse-options.go @@ -1,12 +1,13 @@ package nav import ( - "path/filepath" + "log/slog" "github.com/mohae/deepcopy" "github.com/samber/lo" - "github.com/snivilised/extendio/internal/log" "github.com/snivilised/extendio/xfs/utils" + "go.uber.org/zap/exp/zapslog" + "go.uber.org/zap/zapcore" ) // SubPathBehaviour @@ -124,7 +125,7 @@ type NavigationFilters struct { type NavigationState struct { Root *utils.VarProp[string] Filters *NavigationFilters - Logger utils.RoProp[ClientLogger] + Logger *slog.Logger } // PersistOptions contains options for persisting traverse options @@ -144,23 +145,8 @@ type LogRotationOptions struct { MaxAgeInDays int } -// LoggingOptions -type LoggingOptions struct { - - // Enabled controls logging actuation - Enabled bool - - // Path of log file - Path string - - // TimeStampFormat format of the timestamp field in generated logs - TimeStampFormat string - - // Level controls which the level of logging desired - Level log.Level - - // Rotation log file rotation options - Rotation LogRotationOptions +type MonitorOptions struct { + Log *slog.Logger } // EntryQuantities contains specification of no of files and folders @@ -242,10 +228,6 @@ type OptionsStore struct { // ListenDefs ListenDefinitions - // Logging options - // - Logging LoggingOptions - // Sampling options // Sampling SamplingOptions @@ -277,6 +259,10 @@ type TraverseOptions struct { // B) Use a Custom iterator. When setting the Custom iterator properties // Sampler SamplerOptions `json:"-"` + + // Monitor contains externally provided logger + // + Monitor MonitorOptions `json:"-"` } // TraverseOptionFn functional traverse options @@ -334,12 +320,6 @@ func (o *TraverseOptions) Clone() *TraverseOptions { return clone.(*TraverseOptions) } -const ( - defaultMaxSizeInMb = 50 - defaultMaxNoOfBackups = 3 - defaultMaxAgeInDays = 28 -) - // GetDefaultOptions func GetDefaultOptions() *TraverseOptions { return &TraverseOptions{ @@ -358,16 +338,6 @@ func GetDefaultOptions() *TraverseOptions { InclusiveStop: false, }, }, - Logging: LoggingOptions{ - Path: filepath.Join("~", "snivilised.extendio.nav.log"), - TimeStampFormat: "2006-01-02 15:04:05", - Level: log.InfoLevel, - Rotation: LogRotationOptions{ - MaxSizeInMb: defaultMaxSizeInMb, - MaxNoOfBackups: defaultMaxNoOfBackups, - MaxAgeInDays: defaultMaxAgeInDays, - }, - }, }, Notify: Notifications{ OnBegin: func(_ *NavigationState) {}, @@ -385,6 +355,11 @@ func GetDefaultOptions() *TraverseOptions { Persist: PersistOptions{ Format: PersistInJSONEn, }, + Monitor: MonitorOptions{ + Log: slog.New(zapslog.NewHandler( + zapcore.NewNopCore(), nil), + ), + }, } }