From 464c59b1dcd15e11d572bc300c36ed519ed96bda Mon Sep 17 00:00:00 2001 From: Ousama Ben Younes Date: Thu, 23 Jul 2026 11:29:31 +0000 Subject: [PATCH 1/2] fix: log watched file changes at debug level --- internal/watcher/pattern.go | 27 ++++++++++++++++++++++++--- internal/watcher/pattern_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/internal/watcher/pattern.go b/internal/watcher/pattern.go index be045f747d..b71b9771f0 100644 --- a/internal/watcher/pattern.go +++ b/internal/watcher/pattern.go @@ -11,7 +11,14 @@ import ( "github.com/e-dant/watcher/watcher-go" ) -const sep = string(filepath.Separator) +const ( + sep = string(filepath.Separator) + changedFileLogMessage = "filesystem change detected" + changedFilePathLogAttr = "path" + changedFileAssociatedLogAttr = "associated_path" + specialWatcherEventLogMessage = "special e-dant/watcher event" + watcherEventLogAttr = "event" +) type pattern struct { patternGroup *PatternGroup @@ -101,6 +108,7 @@ func (p *pattern) handle(event *watcher.Event) { } if p.allowReload(event) { + logChangedFile(event) p.events <- eventHolder{p.patternGroup, event} } } @@ -114,13 +122,26 @@ func isValidEventType(effectType watcher.EffectType) bool { } func isValidPathType(event *watcher.Event) bool { - if event.PathType == watcher.PathTypeWatcher && globalLogger.Enabled(globalCtx, slog.LevelDebug) { - globalLogger.LogAttrs(globalCtx, slog.LevelDebug, "special e-dant/watcher event", slog.Any("event", event)) + if event.PathType == watcher.PathTypeWatcher && globalLogger != nil && globalLogger.Enabled(globalCtx, slog.LevelDebug) { + globalLogger.LogAttrs(globalCtx, slog.LevelDebug, specialWatcherEventLogMessage, slog.Any(watcherEventLogAttr, event)) } return event.PathType <= watcher.PathTypeHardLink } +func logChangedFile(event *watcher.Event) { + if globalLogger == nil || !globalLogger.Enabled(globalCtx, slog.LevelDebug) { + return + } + + attrs := []slog.Attr{slog.String(changedFilePathLogAttr, event.PathName)} + if event.AssociatedPathName != "" { + attrs = append(attrs, slog.String(changedFileAssociatedLogAttr, event.AssociatedPathName)) + } + + globalLogger.LogAttrs(globalCtx, slog.LevelDebug, changedFileLogMessage, attrs...) +} + func (p *pattern) isValidPattern(fileName string) bool { if fileName == "" { return false diff --git a/internal/watcher/pattern_test.go b/internal/watcher/pattern_test.go index 8ee3907c7e..04828c20e4 100644 --- a/internal/watcher/pattern_test.go +++ b/internal/watcher/pattern_test.go @@ -3,6 +3,9 @@ package watcher import ( + "bytes" + "context" + "log/slog" "path/filepath" "strings" "testing" @@ -355,6 +358,29 @@ func TestAnAssociatedEventTriggersTheWatcher(t *testing.T) { assert.Equal(t, e, (<-w.events).event) } +func TestAcceptedEventLogsChangedPathAtDebugLevel(t *testing.T) { + var logs bytes.Buffer + previousCtx := globalCtx + previousLogger := globalLogger + globalCtx = context.Background() + globalLogger = slog.New(slog.NewTextHandler(&logs, &slog.HandlerOptions{Level: slog.LevelDebug})) + t.Cleanup(func() { + globalCtx = previousCtx + globalLogger = previousLogger + }) + + w := newPattern(t, "/**/*.php") + w.events = make(chan eventHolder, 1) + + changedPath := normalizePath(t, "/path/file.php") + e := &watcher.Event{PathName: changedPath} + + w.handle(e) + + assert.Equal(t, e, (<-w.events).event) + assert.Contains(t, logs.String(), changedPath) +} + func relativeDir(t *testing.T, relativePath string) string { t.Helper() From 07c74a45aabe18e07a017f3bc11bbd35fe06eb3f Mon Sep 17 00:00:00 2001 From: Ousama Ben Younes Date: Sun, 26 Jul 2026 09:23:53 +0000 Subject: [PATCH 2/2] fix: address watcher debug log review feedback --- internal/watcher/pattern.go | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/internal/watcher/pattern.go b/internal/watcher/pattern.go index b71b9771f0..726fc28008 100644 --- a/internal/watcher/pattern.go +++ b/internal/watcher/pattern.go @@ -11,14 +11,7 @@ import ( "github.com/e-dant/watcher/watcher-go" ) -const ( - sep = string(filepath.Separator) - changedFileLogMessage = "filesystem change detected" - changedFilePathLogAttr = "path" - changedFileAssociatedLogAttr = "associated_path" - specialWatcherEventLogMessage = "special e-dant/watcher event" - watcherEventLogAttr = "event" -) +const sep = string(filepath.Separator) type pattern struct { patternGroup *PatternGroup @@ -123,7 +116,7 @@ func isValidEventType(effectType watcher.EffectType) bool { func isValidPathType(event *watcher.Event) bool { if event.PathType == watcher.PathTypeWatcher && globalLogger != nil && globalLogger.Enabled(globalCtx, slog.LevelDebug) { - globalLogger.LogAttrs(globalCtx, slog.LevelDebug, specialWatcherEventLogMessage, slog.Any(watcherEventLogAttr, event)) + globalLogger.LogAttrs(globalCtx, slog.LevelDebug, "special e-dant/watcher event", slog.Any("event", event)) } return event.PathType <= watcher.PathTypeHardLink @@ -134,12 +127,12 @@ func logChangedFile(event *watcher.Event) { return } - attrs := []slog.Attr{slog.String(changedFilePathLogAttr, event.PathName)} + attrs := []slog.Attr{slog.String("path", event.PathName)} if event.AssociatedPathName != "" { - attrs = append(attrs, slog.String(changedFileAssociatedLogAttr, event.AssociatedPathName)) + attrs = append(attrs, slog.String("associated_path", event.AssociatedPathName)) } - globalLogger.LogAttrs(globalCtx, slog.LevelDebug, changedFileLogMessage, attrs...) + globalLogger.LogAttrs(globalCtx, slog.LevelDebug, "filesystem change detected", attrs...) } func (p *pattern) isValidPattern(fileName string) bool {