It looks like ScopedStreams.jl (suggested by @JamesNZ) does the job! I just had to update log_stdout as follows:
using ScopedStreams
@gen_scoped_stream_methods
function log_stdout(f; label = "")
io = IOBuffer()
local result
try
result = redirect_stream(f, io)
finally
out = String(take!(io))
isempty(out) || @info label * "\n" * out
end
return result
end