Logging is often a good candidate for dynamic scoping. This is where the binding is looked up by traversing the stack, rather than being passed around explicitly; allowing overrides like (let ((log my-other-logger)) (my-thing-which-may-log))
Dynamic scope is useful for things that the code's caller knows better than the code's implementer, and which are otherwise irrelevant to the code's specific functionality (similar to "aspects"; things which are relevant should usually be arguments). Whether something is "relevant" isn't always clear, but if something would mostly get passed along as-is between calls (like we often find with dependency injection) then dynamic scope can (a) avoid such boilerplate, and (b) allows variables to be introduced/removed without changing the code's API.
Examples of using dynamic scope for logging can be found in Scala's Console and Racket's ports
Shameless plug: I wrote a blog post on dynamic scopea blog post on dynamic scope, and how it's related to environment variables.