Not to pop your bubble, Paul, but even die-hard logging fanatics like me don't usually use the log facility to write text data. For one thing, if the point is to create HTML text data, the prologue info (timestamp,
etc.) is going to be objectionable to the consumer (HTML output stream client).
To get the ultimate in outputstream performance, it's a good idea to examine the entire pipeline, start to finish.
Since System.out is a predefined channel, the first thing I'd do is introspect it for its characteristics (buffering strategies, buffer sizes, and so forth). This will probably not be as optimal as if you were using a general-purpose channel, but stdout does have its benefits. You may be able to override some of the performance-related parameters of the System.out channel, but I've not had occasion to do that myself.
Once you know how the buffering scheme works, you can work backwards from there. You may or may not see benefits from pre-building the output in a StringBuilder, since the output stream processor may simply duplicate that work.
Of course the real
test is the real-world performance, since the makeup of the data and the overall system environment can both have an impact. So measure and tune accordingly.