Yes, the addition of the timestamp is not externalized to avoid having strange logs, with later timestamps coming before earlier ones. If externalized, it would likely confuse many users. However I don't mind at all about it.
Is everyone ok with this?
At some point I had the message converted to a binary with an iolist_to_binary call, it's certainly difficult to measure the impact, but I'm not sure what is more expensive: converting to a binary or copying an iolist.
I didn't know about io:put_chars, but it seems to accept binaries and iolists besides charlists (the docs only mention charlists). I'll definitely use it.