Flushing output for Logging immediately without buffering

I’ve got a problem similar to this question: How to flush stdout where I want to log output from a long running script, usually to stderr, and check on it with tail -f
If I run it and redirect the output to a file with either println or @info from the Logging package, it will buffer all the output until the script finishes and write it all at the end.

I saw that this question Issues with println buffering output when redirecting stdout to a txt file had some ideas about making a FlushingIO type, which works for the println case.

Is there a similar way to extend Logging.info to always flush right away? Or alternatively, how can I make sure my logging output doesn’t wait until the script finishes?

You can test the buffering with this small script:

$ cat testprint.jl
using Logging

struct FlushingIO{T}

function Base.println(io::FlushingIO, args...)
    println(io.io, args...)

out = FlushingIO(stderr)

println(stderr, "a")
println(out, "b")
@info "c"
@warn ("d")

julia testprint.jl &> test.log & tail -f test.log


Sorry to bump this, but I’ve got the same problem using Base logging (@info etc). It seems to buffer stdout for many lines before writing to the stream. I’d rather avoid having to put flush(stdout) after every log command. Any better ideas?

1 Like

I have the same issue. Any suggestions?