Binlog Generation

by dotnet0608d8924cd3MIT5.5K starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated today

Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding /bl:{} to any dotnet build, test, pack, publish, or restore command to capture a full build execution trace, prerequisite for binlog-failure-analysis and build-perf-diagnostics skills, enabling post-build investigation of errors or performance. Requires MSBuild 17.8+ / .NET 8 SDK+ for {} placeholder; PowerShell must quote the complete switch as '-bl:{}'. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead).

AI-generated overview

Adds MSBuild binary log switches to .NET build commands so build traces are captured for later analysis.

What it does
This skill instructs an agent to append the /bl:{} switch to MSBuild-based commands such as dotnet build, test, pack, publish, restore, and msbuild. It explains that the {} placeholder produces a unique binlog filename per invocation, how to quote the switch in PowerShell, how to verify a .binlog file was created, and how to choose a specific filename when needed. It also covers excluding binlog files from git clean so build history is preserved.
When to use it
Use it when running any MSBuild or dotnet build, test, pack, publish, or restore command and you want a full execution trace saved. It is also the prerequisite step before analyzing a build failure or investigating build performance.
Requirements
Requires an MSBuild-based toolchain, such as the .NET SDK, with MSBuild 17.8+ / .NET 8 SDK or later for the {} placeholder. No scripts are shipped; it is instructions only.

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 build
  • dotnet test
  • dotnet pack
  • dotnet publish
  • dotnet restore
  • msbuild or msbuild.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.

bash
# Every invocation produces a distinct file automaticallydotnet build /bl:{}dotnet test /bl:{}dotnet build --configuration Release /bl:{}

PowerShell requires quoting the complete switch:

powershell
# Keep the literal {} placeholder in one argumentdotnet build '-bl:{}'dotnet test '-bl:{}'

Why This Matters

  1. Unique names prevent overwrites - You can always go back and analyze previous builds
  2. Failure analysis - When a build fails, the binlog is already there for immediate analysis
  3. Comparison - You can compare builds before and after changes
  4. No re-running builds - You never need to re-run a failed build just to generate a binlog

Examples

bash
# ✅ CORRECT - {} generates a unique name automatically (bash/cmd)dotnet build /bl:{}dotnet test /bl:{}
# ✅ CORRECT - quote the complete PowerShell argumentdotnet build '-bl:{}'dotnet test '-bl:{}'
# ❌ WRONG - Missing /bl flag entirelydotnet builddotnet test
# ❌ WRONG - No filename (overwrites the same msbuild.binlog every time)dotnet build /bldotnet build /bl

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.
bash
dotnet build -c Debug   /bl:{}   # unique filedotnet build -c Release /bl:{}   # another unique file

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:

bash
ls -1 *.binlog       # bashdir /b *.binlog      # Windows cmd
powershell
Get-ChildItem *.binlog   # PowerShell

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:

  1. Check for existing *.binlog files in the directory
  2. Choose a name not already taken (e.g., by incrementing a counter from the highest existing number)
bash
# Example: directory contains 3.binlog — use 4.binlogdotnet build /bl:4.binlog

Cleaning the Repository

When cleaning the repository with git clean, always exclude binlog files to preserve your build history:

bash
# ✅ CORRECT - Exclude binlog files from cleaninggit clean -fdx -e "*.binlog"
# ❌ WRONG - This deletes binlog files (they're usually in .gitignore)git clean -fdx

This is especially important when iterating on build fixes - you need the binlogs to analyze what changed between builds.

Source and attribution

Source:dotnet/skillsinplugins/dotnet-msbuild/skills/binlog-generationat commit0608d89

License: MIT

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal