Contents:

Download MSBuild Structured Log Viewer

or, install from Chocolatey:

C:\> choco install msbuild-structured-log-viewer

or, install the Visual Studio 2017 Extension to investigate builds inside Visual Studio:

Project System Tools

Using MSBuild.exe /bl to record a binary log

MSBuild 15.3 introduces a new command-line switch: /bl to record all build events to a structured/binary log file:

Double-click the .binlog file to open it in MSBuild Structured Log Viewer:

Replaying a .binlog to reconstruct text logs

You can pass a .binlog file to MSBuild instead of a project/solution to replay it to other loggers, as if a real build was happening. This allows you to reconstruct a text log of any verbosity given the .binlog file. Read more at: https://github.com/Microsoft/msbuild/wiki/Binary-Log#replaying-a-binary-log

Binary log advantages

Read more about the new MSBuild binary log format (*.binlog)

Viewer Features

The MSBuild Structured Log Viewer can build projects and solutions or open existing log files:

Leverage the source code of projects and targets embedded in the log file:

The viewer supports three file formats:

  1. *.binlog (official MSBuild binary log format, produced by msbuild.exe /bl
  2. *.buildlog (when you Save As... in the viewer)
  3. *.xml (for large human-readable XML logs)

The viewer can read all 3 formats and can save to either *.buildlog or *.xml.

See here for the list of viewer features

Command-line help for the /bl switch

See MSBuild command-line help msbuild /? for more information on the /bl switch. The switch is available starting with MSBuild 15.3 (Visual Studio 2017 Update 3 or newer).

/binaryLogger[:[LogFile=]output.binlog[;ProjectImports={None,Embed,ZipFile}]] Serializes all build events to a compressed binary file. By default the file is in the current directory and named "msbuild.binlog". The binary log is a detailed description of the build process that can later be used to reconstruct text logs and used by other analysis tools. A binary log is usually 10-20x smaller than the most detailed text diagnostic-level log, but it contains more information. (Short form: /bl) The binary logger by default collects the source text of project files, including all imported projects and target files encountered during the build. The optional ProjectImports switch controls this behavior: ProjectImports=None - Don't collect the project imports. ProjectImports=Embed - Embed project imports in the log file. ProjectImports=ZipFile - Save project files to output.projectimports.zip where output is the same name as the binary log file name. The default setting for ProjectImports is Embed. Note: the logger does not collect non-MSBuild source files such as .cs, .cpp etc. A .binlog file can be "played back" by passing it to msbuild.exe as an argument instead of a project/solution. Other loggers will receive the information contained in the log file as if the original build was happening. You can read more about the binary log and its usages at: https://github.com/Microsoft/msbuild/wiki/Binary-Log Examples: /bl /bl:output.binlog /bl:output.binlog;ProjectImports=None /bl:output.binlog;ProjectImports=ZipFile /bl:..\..\custom.binlog /binaryLogger

Recording a binary log with older versions of MSBuild

The built-in /bl switch was only introduced in MSBuild 15.3 (Visual Studio 2017 Update 3). However there is a way to record a binary log with previous versions of MSBuild as well. You can attach the logger to any MSBuild-based build using the logger library: StructuredLogger.dll. It is available in a NuGet package:

MSBuild.StructuredLogger

Alternatively, you can download StructuredLogger.dll directly from the releases page at: https://github.com/KirillOsenkov/MSBuildStructuredLog/releases

Use a command-line such as this to pass the BinaryLogger to MSBuild:

msbuild solution.sln /t:Rebuild /v:diag /noconlog /logger:BinaryLogger,%localappdata%\MSBuildStructuredLogViewer\app-2.0.40\StructuredLogger.dll;1.binlog

To use a portable version of the logger (e.g. with the dotnet msbuild command) you need a .NET Standard version of StructuredLogger.dll, not the .NET Framework (Desktop) version. Inside the NuGet package there is the lib\netstandard2.0\StructuredLogger.dll. Try passing that to dotnet build like this:

dotnet msbuild Some.sln /v:diag /nologo /logger:BinaryLogger,"packages\MSBuild.StructuredLogger.2.0.11\lib\netstandard2.0\StructuredLogger.dll";"C:\Users\SomeUser\Desktop\binarylog.binlog"

Investigating IDE and design-time builds inside Visual Studio

Use the Project System Tools Visual Studio extension to record binary logs of IDE and design-time builds.

See more information about design-time builds here:
https://github.com/dotnet/project-system/blob/master/docs/design-time-builds.md

Security concerns

The binary log contains and exposes environment variables. Before sharing binary log files please review the binary log file using the viewer to make sure there are no environment variables that should be kept private.

Reading MSBuild .binlogs programmatically

Reference the MSBuild.StructuredLogger NuGet package and Microsoft.Build.Framework/15.8.166 and use this code to read the records from a .binlog:

using System; using Microsoft.Build.Framework; using Microsoft.Build.Logging; using Microsoft.Build.Logging.StructuredLogger; class BinLogReader { static void Main(string[] args) { string binLogFilePath = @"C:\temp\test.binlog"; var binLogReader = new BinLogReader(); foreach (var record in binLogReader.ReadRecords(binLogFilePath)) { var buildEventArgs = record.Args; // print command lines of all tool tasks such as Csc if (buildEventArgs is TaskCommandLineEventArgs taskCommandLine) { Console.WriteLine(taskCommandLine.CommandLine); } } } }
Fork me on GitHub

Source code on GitHub

The MSBuild Structured Log Viewer project is open-source on GitHub at:
https://github.com/KirillOsenkov/MSBuildStructuredLog

This webpage is also open-source at:
https://github.com/KirillOsenkov/MSBuildLog