You could probably achieve something like that using Fish shell and their fish_preexec and fish_postexec event hooks.

Edit: Nope, looks like you can't. You only get the invoked command and no output.

Could you use preexec + tee?

Unfortunately not, the preexec event happens asynchronously from the actual execution of the command. You can't manipulate or otherwise log the output of what's run, all you get is a copy of the command text.