The implementation sounds like it could be improved a little bit, but it doesn’t sound like too much work (easy for me to say ;-). Personally, I’d skip parsing the AST and add a thin layer of function calls over the concurrency primitives, where the functions print out the logging and then does what it need to do. It could be made to be turned on or off at runtime that way, and is a little easier to work with, IMO.
The stdout synchronization might be avoidable by sending each thread to its own file, and then merging the files (or just parsing multiple files) in the visualizer, where timing doesn’t matter so much.
I’m curious if he’s tried this in any larger applications? Has it found bugs?