What you are proposing sounds like a nightmare to debug. The high level perspective of the operation is of course valuable for determining if an investigation is necessary, but the low level perspective in the library code is almost always where the relevant details are hiding. Not logging these details means you are in the dark about anything your abstractions are hiding from higher level code (which is usually a lot)
Simple: include those relevant details in the exceptions instead of hiding them.
You can log your IO and as long as your functions are idempotent that should be enough info to replicate.
Those details don't belong in the error log level, that's what info or trace is for.