Generate Binary Logs
Pass the /bl switch when running any MSBuild-based command. This is a non-negotiable requirement for all .NET builds.
Commands That Require /bl
You MUST add the /bl:{} flag to:
dotnet builddotnet testdotnet packdotnet publishdotnet restoremsbuildormsbuild.exe- Any other command that invokes MSBuild
Preferred: Use {} for Automatic Unique Names
Note: The
{}placeholder requires MSBuild 17.8+ / .NET 8 SDK or later.
The {} placeholder in the binlog filename is replaced by MSBuild with a unique identifier, guaranteeing no two builds ever overwrite each other — without needing to track or check existing files.
PowerShell requires quoting the complete switch:
Why This Matters
- Unique names prevent overwrites - You can always go back and analyze previous builds
- Failure analysis - When a build fails, the binlog is already there for immediate analysis
- Comparison - You can compare builds before and after changes
- No re-running builds - You never need to re-run a failed build just to generate a binlog
Examples
One build = one binlog
Add /bl:{} to every MSBuild invocation separately — never reuse a name and
never rely on bare /bl:
- Building several configurations, projects, or retrying a failed build? Each
command still gets its own
/bl:{}so the logs never overwrite each other.
Verify the binlog exists
After the build, confirm a .binlog was actually produced before moving on to
analysis — a build that fails before MSBuild starts (e.g. a bad argument)
writes no binlog:
Note the resulting path so binlog-failure-analysis or build-perf-diagnostics
can consume it.
When a Specific Filename Is Required
If the binlog filename needs to be known upfront (e.g., for CI artifact upload), or if {} is not available in the installed MSBuild version, pick a name that won't collide with existing files:
- Check for existing
*.binlogfiles in the directory - Choose a name not already taken (e.g., by incrementing a counter from the highest existing number)
Cleaning the Repository
When cleaning the repository with git clean, always exclude binlog files to preserve your build history:
This is especially important when iterating on build fixes - you need the binlogs to analyze what changed between builds.


