I checked this again, and here is some updated information:
It is possible to suppress the MSI GUI and set an external GUI implemented by a third party. This external GUI is able to receive messages from msiexec.exe as it performs the installation. This is mostly to implement a custom progress bar, but it seems you can also intercept most other error messages and status messages: MsiSetExternalUI function.
The interesting parameter is the dwMessageFilter. By setting this you can, for example, receive only the error messages that occur during the installation - or so it would seem. I suppose this can be enough for most purposes.
INSTALLUI_HANDLER MsiSetExternalUI(
_In_ INSTALLUI_HANDLER puiHandler,
_In_ DWORD dwMessageFilter,
_In_ LPVOID pvContext
);
Regrettably I do not have sample code for this at the moment. I will test this later, when I get my system set up properly. The MsiEnableLog function is a related function call that will enable logging to file. Update: Here is what looks like a working SDK example.
At the command line interface level, you can also set logging to flush its buffer immediately to file by adding the ! parameter:
msiexec.exe /I "IsWiX.msi" /QN /L*V! "C:\msilog.log"
This means the log file is written continuously so no log buffer is lost if msiexec.exe crashes. The cost is a significantly slower installer due to the IO overhead.