diff --git a/internal/watcher/pattern.go b/internal/watcher/pattern.go index be045f747d..726fc28008 100644 --- a/internal/watcher/pattern.go +++ b/internal/watcher/pattern.go @@ -101,6 +101,7 @@ func (p *pattern) handle(event *watcher.Event) { } if p.allowReload(event) { + logChangedFile(event) p.events <- eventHolder{p.patternGroup, event} } } @@ -114,13 +115,26 @@ func isValidEventType(effectType watcher.EffectType) bool { } func isValidPathType(event *watcher.Event) bool { - if event.PathType == watcher.PathTypeWatcher && globalLogger.Enabled(globalCtx, slog.LevelDebug) { + if event.PathType == watcher.PathTypeWatcher && globalLogger != nil && globalLogger.Enabled(globalCtx, slog.LevelDebug) { globalLogger.LogAttrs(globalCtx, slog.LevelDebug, "special e-dant/watcher event", slog.Any("event", 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("path", event.PathName)} + if event.AssociatedPathName != "" { + attrs = append(attrs, slog.String("associated_path", event.AssociatedPathName)) + } + + globalLogger.LogAttrs(globalCtx, slog.LevelDebug, "filesystem change detected", 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()