djb's old daemontools suite had an interesting solution to the "how to log failure when you can't write to a log" problem: a persistent child process with some space reserved in its argv, where it can stash some error messages which you can see with "ps" even when disks have failed.
printf and friends was not supposed to be robust, was supposed to be easy to use. C already provides the means to write robust libraries, if that is necessary.
http://cr.yp.to/daemontools/readproctitle.html