To compile the project, I’m running the following command:
RunUAT.bat BuildEditor -project=“[path to .uproject]” -notools
This works fine, but since Unreal 5.8 the output in the console window is delayed.
What it does is run normally until the list of files of the Adaptive Build, then pause. When it has finished compiling, the rest of the log appears in one go.
What it used to do is show every line as it was compiling, like these:
[10/21] Compile [x64] GameStateManager.cpp
[11/21] Compile [x64] SnippetTable.cpp
This was useful to a) see progress, and b) see errors early.
I looked into this because it was biting us too. Here are my findings.
Since UE 5.7, all UBA-accelerated builds route their per-action console output through a different path than they used to. In the current source, ActionLogger.LogAction sends the [x/N] Compile Foo.cpp line and each action’s output through _writeToolOutput (see UnrealBuildTool/Executors/ActionLogger.cs around line 250). This eventually lands in ActionExecutor.WriteToolOutput and LogEventParser.WriteLine (see UnrealBuildTool/Actions/ActionExecutor.cs around line 90 with the parser created around line 30). LogEventParser buffers lines so it can match multi-line diagnostics, and it’s only fully drained when Flush() is called. For a UBA build, this Flush() happens in ActionLogger.TraceSummary, which is invoked once at the very end of the build (see UBAExecutor.cs around line 1200). That’s why everything appears in one burst when the build finishes. Before 5.7, UBAExecutor logged those lines straight to the logger, so they streamed live.
The change that introduced this unpleasant behavior is commit 4e77bdaca1ac with the commit message: “Moved logging out of ImmediateActionQueue and into base class ActionLogger. This made it possible to reuse logging logic for UbaExecutor.” The commit was mostly about the UBA scheduler, but by unifying the logging path in the interest of code reuse, UBA quietly inherited the local executor’s buffering parser.
As far as I can tell, there’s no UBT flag that recovers the incremental streaming behavior, i.e., _writeToolOutput is wired to the parser unconditionally. In our code, we needed to stop relying on up-to-date output from RunUAT. Instead, we noticed that RunUAT still writes its log file incrementally throughout the build, andRunUAT prints the log file location at the beginning of the build. So we launch the build, detect the log file location, and then listen for changes to the log file on a background thread to get live progress. Our implementation is here if it’s useful:
I did suspect UBA, but found no option to turn the new logging off. Also fully disabling UBA did not work either, maybe that is no longer a possibility?
Would be very nice if Epic gave us the option, this is rather annoying.