Logging
Buck2 produces detailed event logs for each invocation, which follow a schema
outlined in app/buck2_data/data.proto
in the buck2 parent directory. The event
logs that Buck2 produces automatically are always in protobuf zstd-compressed
format (see Viewing the event log for more details).
Event log format
Warning: the schemas are all subject to change, so we do not recommend relying
on the format. For the source of truth, take a look at data.proto
.
Invocation header
The first line of the event log is always the Invocation
header:
Invocation {
# CLI args split into a list of strings
command_line_args: List[str],
# Expanded CLI args, which expand any argsfiles
expanded_command_line_args: List[str],
# Absolute path of the current working directory of the Buck2 command
working_dir: str,
# UUID of the Buck2 command
trace_id: str,
}
Command result footer
The last line is always the CommandResult
:
Result {
# One of the result types of CommandResult protobuf type in data.proto
result: BuildResponse | CqueryResponse | BxlResponse | ...,
}
Buck events
The rest of the event log contain BuckEvent
s, which are either
SpanStartEvent
s, SpanEndEvent
s, or InstantEvent
s.
The BuckEvent
format is roughly as follows:
Event {
# When the event was fired. This is always a 2-item list, where the first
# value is millis, second value is micros
timestamp: List[u64],
# UUID of the Buck2 command, same one as the invocation header
trace_id: str,
# A trace-unique 64-bit integer identifying this event's span ID,
# if this event begins a new span or belongs to one.
span_id: u64,
# A trace-unique 64-bit identifying the span that this event is logically
# parented to.
parent_id: u64,
# See sections below for more details
data: SpanStart | SpanEnd | Instant,
}
Span starts
The SpanStartEvent
indicates that a span of work starting:
SpanStart {
# One of the data types of SpanStartEvent protobuf type in data.proto
data: AnalysisStart | ActionExecutionStart | ...,
}
Span ends
The SpanEndEvent
indicates that a span of work has finished:
SpanEnd {
# Duration of the span
duration_us: u64,
# CPU poll times for this span
stats: SpanStats,
# One of the data types of SpanEndEvent protobuf type in data.proto
data: AnalysisEnd | ActionExecutionEnd | ...,
}
# CPU poll times for this span
SpanStats {
max_poll_time_us: u64,
total_poll_time_us: u64,
}
Instant events
The InstantEvent
represents a single point in time:
InstantEvent {
# One of the data types of InstantEvent protobuf type in data.proto
data: ConsoleMessage | ActionError | ...,
}
One specific instant event type that may be of interest is the SnapShot
event,
which includes some interesting details like RSS, CPU, I/O, remote execution,
and DICE metrics.
Viewing the event log
Event logs can be accessed using commands under buck2 log show
, which outputs
the event logs in JSONL format. You can run buck2 log show --help
to see all
available options. Some useful commands:
- Show the logs for the most recent Buck2 command:
buck2 log show
- Show the logs for a specific Buck2 command, given the command's UUID:
buck2 log show --trace-id <UUID>
- Show the logs for a recent Buck2 command:
buck2 log show --recent <NUMBER>
The JSON schema is derived from the protobuf types, and the log itself could be quite large. jq can be useful to find specific things. For example, this jq script shows the max event delay between a snapshot event creation on the daemon side, and when the client receives it.
buck2 log show | jq -s '
map(
.Event.data.Instant.data.Snapshot.this_event_client_delay_ms
| select(. != null)
) | max'