<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.11 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc docindent="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>

<rfc ipr="trust200902" docName="draft-marx-qlog-main-schema-03" category="std">

  <front>
    <title>Main logging schema for qlog</title>

    <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
      <organization>KU Leuven</organization>
      <address>
        <email>robin.marx@kuleuven.be</email>
      </address>
    </author>
    <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
      <organization>Facebook</organization>
      <address>
        <email>lniccolini@fb.com</email>
      </address>
    </author>
    <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
      <organization>Protocol Labs</organization>
      <address>
        <email>marten@protocol.ai</email>
      </address>
    </author>

    <date year="2021" month="May" day="15"/>

    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document describes a high-level schema for a standardized logging format
called qlog.  This format allows easy sharing of data and the creation of reusable
visualization and debugging tools. The high-level schema in this document is
intended to be protocol-agnostic. Separate documents specify how the format should
be used for specific protocol data. The schema is also format-agnostic, and can be
represented in for example JSON, csv or protobuf.</t>



    </abstract>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>There is currently a lack of an easily usable, standardized endpoint logging
format. Especially for the use case of debugging and evaluating modern Web
protocols and their performance, it is often difficult to obtain structured logs
that provide adequate information for tasks like problem root cause analysis.</t>

<t>This document aims to provide a high-level schema and harness that describes the
general layout of an easily usable, shareable, aggregatable and structured logging
format. This high-level schema is protocol agnostic, with logging entries for
specific protocols and use cases being defined in other documents (see for example
<xref target="QLOG-QUIC"></xref> for QUIC and <xref target="QLOG-H3"></xref> for HTTP/3 and QPACK-related event
definitions).</t>

<t>The goal of this high-level schema is to provide amenities and default
characteristics that each logging file should contain (or should be able to
contain), such that generic and reusable toolsets can be created that can deal
with logs from a variety of different protocols and use cases.</t>

<t>As such, this document contains concepts such as versioning, metadata inclusion,
log aggregation, event grouping and log file size reduction techniques.</t>

<t>Feedback and discussion are welcome at
<eref target="https://github.com/quiclog/internet-drafts">https://github.com/quiclog/internet-drafts</eref>.
Readers are advised to refer to the “editor’s draft” at that URL for an up-to-date
version of this document.</t>

<section anchor="data_types" title="Notational Conventions">

<t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”,
“SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be
interpreted as described in <xref target="RFC2119"/>.</t>

<t>While the qlog schema’s are format-agnostic, for readability the qlog documents
will use a JSON-inspired format (<xref target="RFC8259"/>) for examples and definitions.</t>

<t>As qlog can be serialized both textually but also in binary, we employ a custom
datatype definition language, inspired loosely by the <eref target="https://www.typescriptlang.org/">“TypeScript”
language</eref>.</t>

<t>This document describes how to employ JSON and NDJSON as textual serializations
for qlog in <xref target="concrete-formats"/>. Other documents will describe how to utilize
other concrete serialization options, though tips and requirements for these are
also listed in this document (<xref target="concrete-formats"/>).</t>

<t>The main general conventions in this document a reader should be aware of are:</t>

<t><list style="symbols">
  <t>obj? : this object is optional</t>
  <t>type1 | type2 : a union of these two types (object can be either type1 OR
type2)</t>
  <t>obj:type : this object has this concrete type</t>
  <t>obj:array&lt;type&gt; : this object is an array of this type</t>
  <t>class : defines a new type</t>
  <t>// : single-line comment</t>
</list></t>

<t>The main data types are:</t>

<t><list style="symbols">
  <t>int8 : signed 8-bit integer</t>
  <t>int16 : signed 16-bit integer</t>
  <t>int32 : signed 32-bit integer</t>
  <t>int64 : signed 64-bit integer</t>
  <t>uint8 : unsigned 8-bit integer</t>
  <t>uint16 : unsigned 16-bit integer</t>
  <t>uint32 : unsigned 32-bit integer</t>
  <t>uint64 : unsigned 64-bit integer</t>
  <t>float : 32-bit floating point value</t>
  <t>double : 64-bit floating point value</t>
  <t>byte : an individual raw byte (8-bit) value (use array&lt;byte&gt; or the
shorthand “bytes” to specify a binary blob)</t>
  <t>string : list of Unicode (typically UTF-8) encoded characters</t>
  <t>boolean : boolean</t>
  <t>enum: fixed list of values (Unless explicity defined, the value of an enum entry
is the string version of its name (e.g., initial = “initial”))</t>
  <t>any : represents any object type. Mainly used here as a placeholder for more
concrete types defined in related documents (e.g., specific event types)</t>
</list></t>

<t>All timestamps and time-related values (e.g., offsets) in qlog are logged as
doubles in the millisecond resolution.</t>

<t>Other qlog documents can define their own data types (e.g., separately for each
Packet type that a protocol supports).</t>

</section>
</section>
<section anchor="design-goals" title="Design goals">

<t>The main tenets for the qlog schema design are:</t>

<t><list style="symbols">
  <t>Streamable, event-based logging</t>
  <t>Flexibility in the format, complexity in the tooling (e.g., few components are a
MUST, tools need to deal with this)</t>
  <t>Extensible and pragmatic (e.g., no complex fixed schema with extension points)</t>
  <t>Aggregation and transformation friendly (e.g., the top-level element is a
container for individual traces, group_id can be used to tag events to a
particular context)</t>
  <t>Metadata is stored together with event data</t>
</list></t>

</section>
<section anchor="top-level" title="The high level qlog schema">

<t>A qlog file should be able to contain several indivdual traces and logs from
multiple vantage points that are in some way related. To that end, the top-level
element in the qlog schema defines only a small set of “header” fields and an
array of component traces. For this document, the required “qlog_version” field
MUST have a value of “qlog-03-WIP”.</t>

<t><list style="hanging">
  <t hangText='Note:'>
  there have been several previously broadly deployed qlog versions based on older
drafts of this document (see draft-marx-qlog-main-schema). The old values for the
“qlog_version” field were “draft-00”, “draft-01” and “draft-02”. When qlog was
moved to the QUIC working group, we decided to increment the existing counter,
rather than reverting back to -00. As such, any numbering indicating in the
“qlog_version” field is explicitly not tied to a particular version of the draft
documents.</t>
</list></t>

<t>As qlog can be serialized in a variety of ways, the “qlog_format” field is used to
indicate which serialization option was chosen. Its value MUST either be one of
the options defined in this document (e.g., <xref target="concrete-formats"/>) or the field
must be omitted entirely, in which case it assumes the default value of “JSON”.</t>

<t>In order to make it easier to parse and identify qlog files and their
serialization format, the “qlog_version” and “qlog_format” fields and their values
SHOULD be in the first 256 characters/bytes of the resulting log file.</t>

<t>An example of the qlog file’s top-level structure is shown in <xref target="top-element"/>.</t>

<figure title="Top-level element" anchor="top-element"><artwork type="json"><![CDATA[
Definition:

class QlogFile {
    qlog_version:string,
    qlog_format?:string,
    title?:string,
    description?:string,
    summary?: Summary,
    traces: array<Trace|TraceError>
}

JSON serialization:

{
    "qlog_version": "draft-03-WIP",
    "qlog_format": "JSON",
    "title": "Name of this particular qlog file (short)",
    "description": "Description for this group of traces (long)",
    "summary": {
        ...
    },
    "traces": [...]
}
]]></artwork></figure>

<section anchor="summary" title="summary">

<t>In a real-life deployment with a large amount of generated logs, it can be useful
to sort and filter logs based on some basic summarized or aggregated data (e.g.,
log length, packet loss rate, log location, presence of error events, …). The
summary field (if present) SHOULD be on top of the qlog file, as this allows for
the file to be processed in a streaming fashion (i.e., the implementation could
just read up to and including the summary field and then only load the full logs
that are deemed interesting by the user).</t>

<t>As the summary field is highly deployment-specific, this document does not specify
any default fields or their semantics. Some examples of potential entries are
shown in <xref target="summary-example"/>.</t>

<figure title="Summary example definition" anchor="summary-example"><artwork type="json"><![CDATA[
Definition (purely illustrative example):

class Summary {
    "trace_count":uint32, // amount of traces in this file
    "max_duration":uint64, // time duration of the longest trace in ms
    "max_outgoing_loss_rate":float, // highest loss rate for outgoing packets over all traces
    "total_event_count":uint64, // total number of events across all traces,
    "error_count":uint64 // total number of error events in this trace
}

JSON serialization:

{
    "trace_count": 1,
    "max_duration": 5006,
    "max_outgoing_loss_rate": 0.013,
    "total_event_count": 568,
    "error_count": 2
}
]]></artwork></figure>

</section>
<section anchor="traces" title="traces">

<t>It is often advantageous to group several related qlog traces together in a single
file. For example, we can simultaneously perform logging on the client, on the
server and on a single point on their common network path. For analysis, it is
useful to aggregate these three individual traces together into a single file, so
it can be uniquely stored, transferred and annotated.</t>

<t>As such, the “traces” array contains a list of individual qlog traces. Typical
qlogs will only contain a single trace in this array. These can later be combined
into a single qlog file by taking the “traces” entry/entries for each qlog file
individually and copying them to the “traces” array of a new, aggregated qlog
file. This is typically done in a post-processing step.</t>

<t>The “traces” array can thus contain both normal traces (for the definition of the
Trace type, see <xref target="trace"/>), but also “error” entries. These indicate that we tried
to find/convert a file for inclusion in the aggregated qlog, but there was an
error during the process. Rather than silently dropping the erroneous file, we can
opt to explicitly include it in the qlog file as an entry in the “traces” array,
as shown in <xref target="trace-error"/>.</t>

<figure title="TraceError definition" anchor="trace-error"><artwork type="json"><![CDATA[
Definition:

class TraceError {
    error_description: string, // A description of the error
    uri?: string, // the original URI at which we attempted to find the file
    vantage_point?: VantagePoint // see {{vantage_point}}: the vantage point we were expecting to include here
}

JSON serialization:

{
    "error_description": "File could not be found",
    "uri": "/srv/traces/today/latest.qlog",
    "vantage_point": { type: "server" }
}
]]></artwork></figure>

<t>Note that another way to combine events of different traces in a single qlog file
is through the use of the “group_id” field, discussed in <xref target="group-ids"/>.</t>

</section>
<section anchor="trace" title="Individual Trace containers">

<t>The exact conceptual definition of a Trace can be fluid. For example, a trace
could contain all events for a single connection, for a single endpoint, for a
single measurement interval, for a single protocol, etc. As such, a Trace
container contains some metadata in addition to the logged events, see
<xref target="trace-container"/>.</t>

<t>In the normal use case however, a trace is a log of a single data flow collected
at a single location or vantage point. For example, for QUIC, a single trace only
contains events for a single logical QUIC connection for either the client or the
server.</t>

<t>The semantics and context of the trace can mainly be deduced from the entries in
the “common_fields” list and “vantage_point” field.</t>

<figure title="Trace container definition" anchor="trace-container"><artwork type="json"><![CDATA[
Definition:

class Trace {
    title?: string,
    description?: string,
    configuration?: Configuration,
    common_fields?: CommonFields,
    vantage_point: VantagePoint,
    events: array<Event>
}

JSON serialization:

{
    "title": "Name of this particular trace (short)",
    "description": "Description for this trace (long)",
    "configuration": {
        "time_offset": 150
    },
    "common_fields": {
        "ODCID": "abcde1234",
        "time_format": "absolute"
    },
    "vantage_point": {
        "name": "backend-67",
        "type": "server"
    },
    "events": [...]
}
]]></artwork></figure>

<section anchor="configuration" title="configuration">

<t>We take into account that a qlog file is usually not used in isolation, but by
means of various tools. Especially when aggregating various traces together or
preparing traces for a demonstration, one might wish to persist certain tool-based
settings inside the qlog file itself. For this, the configuration field is used.</t>

<t>The configuration field can be viewed as a generic metadata field that tools can
fill with their own fields, based on per-tool logic. It is best practice for tools
to prefix each added field with their tool name to prevent collisions across
tools. This document only defines two optional, standard, tool-independent
configuration settings: “time_offset” and “original_uris”.</t>

<figure title="Configuration definition" anchor="configuration_example"><artwork type="json"><![CDATA[
Definition:

class Configuration {
    time_offset:double, // in ms,
    original_uris: array<string>,

    // list of fields with any type
}

JSON serialization:

{
    "time_offset": 150, // starts 150ms after the first timestamp indicates
    "original_uris": [
        "https://example.org/trace1.qlog",
        "https://example.org/trace2.qlog"
    ]
}
]]></artwork></figure>

<section anchor="timeoffset" title="time_offset">
<t>The time_offset field indicates by how many milliseconds the starting time of the current
trace should be offset. This is useful when comparing logs taken from various
systems, where clocks might not be perfectly synchronous. Users could use manual
tools or automated logic to align traces in time and the found optimal offsets can
be stored in this field for future usage. The default value is 0.</t>

</section>
<section anchor="originaluris" title="original_uris">
<t>The original_uris field is used when merging multiple individual qlog files or
other source files (e.g., when converting .pcaps to qlog). It allows to keep
better track where certain data came from. It is a simple array of strings. It is
an array instead of a single string, since a single qlog trace can be made up out
of an aggregation of multiple component qlog traces as well. The default value is
an empty array.</t>

</section>
<section anchor="custom-fields" title="custom fields">
<t>Tools can add optional custom metadata to the “configuration” field to store state
and make it easier to share specific data viewpoints and view configurations.</t>

<t>Two examples from the <eref target="https://qvis.edm.uhasselt.be">qvis toolset</eref> are shown in
<xref target="qvis-config"/>.</t>

<figure title="Custom configuration fields example" anchor="qvis-config"><artwork><![CDATA[
{
    "configuration" : {
        "qvis" : {
            // when loaded into the qvis toolsuite's congestion graph tool
            // zoom in on the period between 1s and 2s and select the 124th event defined in this trace
            "congestion_graph": {
                "startX": 1000,
                "endX": 2000,
                "focusOnEventIndex": 124
            }


            // when loaded into the qvis toolsuite's sequence diagram tool
            // automatically scroll down the timeline to the 555th event defined in this trace
            "sequence_diagram" : {
                "focusOnEventIndex": 555
            }
        }
    }
}
]]></artwork></figure>

</section>
</section>
<section anchor="vantage-point" title="vantage_point">

<t>The vantage_point field describes the vantage point from which the trace
originates, see <xref target="vantage-point-example"/>. Each trace can have only a single vantage_point
and thus all events in a trace MUST BE from the perspective of this vantage_point.
To include events from multiple vantage_points, implementers can for example
include multiple traces, split by vantage_point, in a single qlog file.</t>

<figure title="VantagePoint definition" anchor="vantage-point-example"><artwork type="json"><![CDATA[
Definition:

class VantagePoint {
    name?: string,
    type: VantagePointType,
    flow?: VantagePointType
}

class VantagePointType {
    server, // endpoint which initiates the connection.
    client, // endpoint which accepts the connection.
    network, // observer in between client and server.
    unknown
}

JSON serialization examples:

{
    "name": "aioquic client",
    "type": "client",
}

{
    "name": "wireshark trace",
    "type": "network",
    "flow": "client"
}
]]></artwork></figure>

<t>The flow field is only required if the type is “network” (for example, the trace
is generated from a packet capture). It is used to disambiguate events like
“packet sent” and “packet received”. This is indicated explicitly because for
multiple reasons (e.g., privacy) data from which the flow direction can be
otherwise inferred (e.g., IP addresses) might not be present in the logs.</t>

<t>Meaning of the different values for the flow field:
  * “client” indicates that this vantage point follows client data flow semantics (a
    “packet sent” event goes in the direction of the server).
  * “server” indicates that this vantage point follow server data flow semantics (a
    “packet sent” event goes in the direction of the client).
  * “unknown” indicates that the flow’s direction is unknown.</t>

<t>Depending on the context, tools confronted with “unknown” values in the
vantage_point can either try to heuristically infer the semantics from
protocol-level domain knowledge (e.g., in QUIC, the client always sends the first
packet) or give the user the option to switch between client and server
perspectives manually.</t>

</section>
</section>
<section anchor="field-name-semantics" title="Field name semantics">

<t>Inside of the “events” field of a qlog trace is a list of events logged by the
endpoint. Each event is specified as a generic object with a number of member
fields and their associated data. Depending on the protocol and use case, the
exact member field names and their formats can differ across implementations. This
section lists the main, pre-defined and reserved field names with specific
semantics and expected corresponding value formats.</t>

<t>Each qlog event at minimum requires the “time” (<xref target="time-based-fields"/>), “name”
(<xref target="name-field"/>) and “data” (<xref target="data-field"/>) fields. Other typical fields are
“time_format” (<xref target="time-based-fields"/>), “protocol_type” (<xref target="protocol-type-field"/>),
“trigger” (<xref target="trigger-field"/>), and “group_id” <xref target="group-ids"/>. As especially these
later fields typically have identical values across individual event instances,
they are normally logged separately in the “common_fields” (<xref target="common-fields"/>).</t>

<t>The specific values for each of these fields and their semantics are defined in
separate documents, specific per protocol or use case. For example: event
definitions for QUIC, HTTP/3 and QPACK can be found in <xref target="QLOG-QUIC"></xref> and <xref target="QLOG-H3"></xref>.</t>

<t>Other fields are explicitly allowed by the qlog approach, and tools SHOULD allow
for the presence of unknown event fields, but their semantics depend on the
context of the log usage (e.g., for QUIC, the ODCID field is used), see
<xref target="QLOG-QUIC"></xref>.</t>

<t>An example of a qlog event with its component fields is shown in
<xref target="event-definition"/>.</t>

<figure title="Event fields definition" anchor="event-definition"><artwork type="json"><![CDATA[
Definition:

class Event {
    time: double,
    name: string,
    data: any,

    protocol_type?: Array<string>,
    group_id?: string|uint32,

    time_format?: "absolute"|"delta"|"relative",

    // list of fields with any type
}

JSON serialization:

{
    time: 1553986553572,

    name: "transport:packet_sent",
    data: { ... }

    protocol_type:  ["QUIC","HTTP3"],
    group_id: "127ecc830d98f9d54a42c4f0842aa87e181a",

    time_format: "absolute",

    ODCID: "127ecc830d98f9d54a42c4f0842aa87e181a", // QUIC specific
}
]]></artwork></figure>

<section anchor="time-based-fields" title="timestamps">

<t>The “time” field indicates the timestamp at which the event occured. Its value is
typically the Unix timestamp since the 1970 epoch (number of milliseconds since
midnight UTC, January 1, 1970, ignoring leap seconds). However, qlog supports two
more succint timestamps formats to allow reducing file size. The employed format
is indicated in the “time_format” field, which allows one of three values:
“absolute”, “delta” or “relative”:</t>

<t><list style="symbols">
  <t>Absolute: Include the full absolute timestamp with each event. This approach
uses the largest amount of characters. This is also the default value of the
“time_format” field.</t>
  <t>Delta: Delta-encode each time value on the previously logged value. The first
event in a trace typically logs the full absolute timestamp. This approach uses
the least amount of characters.</t>
  <t>Relative: Specify a full “reference_time” timestamp (typically this is done
up-front in “common_fields”, see <xref target="common-fields"/>) and include only
relatively-encoded values based on this reference_time with each event. The
“reference_time” value is typically the first absolute timestamp. This approach
uses a medium amount of characters.</t>
</list></t>

<t>The first option is good for stateless loggers, the second and third for stateful
loggers. The third option is generally preferred, since it produces smaller files
while being easier to reason about. An example for each option can be seen in
<xref target="time-examples"/>.</t>

<figure title="Three different approaches for logging timestamps" anchor="time-examples"><artwork><![CDATA[
The absolute approach will use:
1500, 1505, 1522, 1588

The delta approach will use:
1500, 5, 17, 66

The relative approach will:
- set the reference_time to 1500 in "common_fields"
- use: 0, 5, 22, 88

]]></artwork></figure>

<t>One of these options is typically chosen for the entire trace (put differently:
each event has the same value for the “time_format” field). Each event MUST
include a timestamp in the “time” field.</t>

<t>Events in each individual trace SHOULD be logged in strictly ascending timestamp
order (though not necessarily absolute value, for the “delta” format). Tools CAN
sort all events on the timestamp before processing them, though are not required
to (as this could impose a significant processing overhead). This can be a problem
especially for multi-threaded and/or streaming loggers, who could consider using a
separate postprocesser to order qlog events in time if a tool do not provide this
feature.</t>

<t>Timestamps do not have to use the UNIX epoch timestamp as their reference. For
example for privacy considerations, any initial reference timestamps (for example
“endpoint uptime in ms” or “time since connection start in ms”) can be chosen.
Tools SHOULD NOT assume the ability to derive the absolute Unix timestamp from
qlog traces, nor allow on them to relatively order events across two or more
separate traces (in this case, clock drift should also be taken into account).</t>

</section>
<section anchor="name-field" title="category and event">

<t>Events differ mainly in the type of metadata associated with them. To help
identify a given event and how to interpret its metadata in the “data” field (see
<xref target="data-field"/>), each event has an associated “name” field. This can be considered
as a concatenation of two other fields, namely event “category” and event “type”.</t>

<t>Category allows a higher-level grouping of events per specific event type. For
example for QUIC and HTTP/3, the different categories could be “transport”,
“http”, “qpack”, and “recovery”. Within these categories, the event Type provides
additional granularity. For example for QUIC and HTTP/3, within the “transport”
Category, there would be “packet_sent” and “packet_received” events.</t>

<t>Logging category and type separately conceptually allows for fast and high-level
filtering based on category and the re-use of event types across categories.
However, it also considerably inflates the log size and this flexibility is not
used extensively in practice at the time of writing.</t>

<t>As such, the default approach in qlog is to concatenate both field values using
the “:” character in the “name” field, as can be seen in <xref target="name-example"/>. As
such, qlog category and type names MUST NOT include this character.</t>

<figure title="Ways of logging category, type and name of an event." anchor="name-example"><artwork><![CDATA[
JSON serialization using separate fields:
{
    category: "transport",
    type: "packet_sent"
}

JSON serialization using ":" concatenated field:
{
    name: "transport:packet_sent"
}
]]></artwork></figure>

<t>Certain serializations CAN emit category and type as separate fields, and qlog
tools SHOULD be able to deal with both the concatenated “name” field, and the
separate “category” and “type” fields. Text-based serializations however are
encouraged to employ the concatenated “name” field for efficiency.</t>

</section>
<section anchor="data-field" title="data">

<t>The data field is a generic object. It contains the per-event metadata and its
form and semantics are defined per specific sort of event. For example, data field
value definitons for QUIC and HTTP/3 can be found in <xref target="QLOG-QUIC"></xref> and <xref target="QLOG-H3"></xref>.</t>

<t>One purely illustrative example for a QUIC “packet_sent” event is shown in
<xref target="data-example"/>.</t>

<figure title="Example of the 'data' field for a QUIC packet_sent event" anchor="data-example"><artwork type="json"><![CDATA[
Definition:

class TransportPacketSentEvent {
    packet_size?:uint32,
    header:PacketHeader,
    frames?:Array<QuicFrame>
}

JSON serialization:

{
    packet_size: 1280,
    header: {
        packet_type: "1RTT",
        packet_number: 123
    },
    frames: [
        {
            frame_type: "stream",
            length: 1000,
            offset: 456
        },
        {
            frame_type: "padding"
        }
    ]
}
]]></artwork></figure>

</section>
<section anchor="protocol-type-field" title="protocol_type">

<t>The “protocol_type” array field indicates to which protocols (or protocol
“stacks”) this event belongs. This allows a single qlog file to aggregate traces
of different protocols (e.g., a web server offering both TCP+HTTP/2 and
QUIC+HTTP/3 connections).</t>

<t>For example, QUIC and HTTP/3 events have the “QUIC” and “HTTP3” protocol_type
entry values, see <xref target="QLOG-QUIC"></xref> and <xref target="QLOG-H3"></xref>.</t>

<t>Typically however, all events in a single trace are of the same few protocols, and
this array field is logged once in “common_fields”, see <xref target="common-fields"/>.</t>

</section>
<section anchor="trigger-field" title="triggers">

<t>Sometimes, additional information is needed in the case where a single event can
be caused by a variety of other events. In the normal case, the context of the
surrounding log messages gives a hint as to which of these other events was the
cause. However, in highly-parallel and optimized implementations, corresponding
log messages might separated in time. Another option is to explicitly indicate
these “triggers” in a high-level way per-event to get more fine-grained
information without much additional overhead.</t>

<t>In qlog, the optional “trigger” field contains a string value describing the
reason (if any) for this event instance occuring. While this “trigger” field could
be a property of the qlog Event itself, it is instead a property of the “data”
field instead. This choice was made because many event types do not include a
trigger value, and having the field at the Event-level would cause overhead in
some serializations. Additional information on the trigger can be added in the
form of additional member fields of the “data” field value, yet this is highly
implementation-specific, as are the trigger field’s string values.</t>

<t>One purely illustrative example of some potential triggers for QUIC’s
“packet_dropped” event is shown in <xref target="trigger-example"/>.</t>

<figure title="Trigger example" anchor="trigger-example"><artwork type="json"><![CDATA[
Definition:

class QuicPacketDroppedEvent {
    packet_type?:PacketType,
    raw_length?:uint32,

    trigger?: "key_unavailable" | "unknown_connection_id" | "decrypt_error" | "unsupported_version"
}
]]></artwork></figure>

</section>
<section anchor="group-ids" title="group_id">

<t>As discussed in <xref target="trace"/>, a single qlog file can contain several traces taken
from different vantage points. However, a single trace from one endpoint can also
contain events from a variety of sources. For example, a server implementation
might choose to log events for all incoming connections in a single large
(streamed) qlog file. As such, we need a method for splitting up events belonging
to separate logical entities.</t>

<t>The simplest way to perform this splitting is by associating a “group identifier”
to each event that indicates to which conceptual “group” each event belongs. A
post-processing step can then extract events per group. However, this group
identifier can be highly protocol and context-specific. In the example above, we
might use QUIC’s “Original Destination Connection ID” to uniquely identify a
connection. As such, they might add a “ODCID” field to each event. However, a
middlebox logging IP or TCP traffic might rather use four-tuples to identify
connections, and add a “four_tuple” field.</t>

<t>As such, to provide consistency and ease of tooling in cross-protocol and
cross-context setups, qlog instead defines the common “group_id” field, which
contains a string value. Implementations are free to use their preferred string
serialization for this field, so long as it contains a unique value per logical
group. Some examples can be seen in <xref target="group-id-example"/>.</t>

<figure title="Example of group_id usage" anchor="group-id-example"><artwork type="json"><![CDATA[
JSON serialization for events grouped by four tuples and QUIC connection IDs:

events: [
    {
        time: 1553986553579,
        protocol_type: ["TCP", "TLS", "HTTP2"],
        group_id: "ip1=2001:67c:1232:144:9498:6df6:f450:110b,ip2=2001:67c:2b0:1c1::198,port1=59105,port2=80",
        name: "transport:packet_received",
        data: { ... },
    },
    {
        time: 1553986553581,
        protocol_type: ["QUIC","HTTP3"],
        group_id: "127ecc830d98f9d54a42c4f0842aa87e181a",
        name: "transport:packet_sent",
        data: { ... },
    }
]
]]></artwork></figure>

<t>Note that in some contexts (for example a Multipath transport protocol) it might
make sense to add additional contextual per-event fields (for example “path_id”),
rather than use the group_id field for that purpose.</t>

<t>Note also that, typically, a single trace only contains events belonging to a
single logical group (for example, an individual QUIC connection). As such,
instead of logging the “group_id” field with an identical value for each event
instance, this field is typically logged once in “common_fields”, see
<xref target="common-fields"/>.</t>

</section>
<section anchor="common-fields" title="common_fields">

<t>As discussed in the previous sections, information for a typical qlog event varies
in three main fields: “time”, “name” and associated data. Additionally, there are
also several more advanced fields that allow mixing events from different
protocols and contexts inside of the same trace (for example “protocol_type” and
“group_id”). In most “normal” use cases however, the values of these advanced
fields are consistent for each event instance (for example, a single trace
contains events for a single QUIC connection).</t>

<t>To reduce file size and making logging easier, qlog uses the “common_fields” list
to indicate those fields and their values that are shared by all events in this
component trace. This prevents these fields from being logged for each individual
event. An example of this is shown in <xref target="common-fields-example"/>.</t>

<figure title="Example of common_fields usage" anchor="common-fields-example"><artwork type="json"><![CDATA[
JSON serialization with repeated field values per-event instance:

{
    events: [{
            group_id: "127ecc830d98f9d54a42c4f0842aa87e181a",
            protocol_type: ["QUIC","HTTP3"],
            time_format: "relative",
            reference_time: "1553986553572",

            time: 2,
            name: "transport:packet_received",
            data: { ... }
        },{
            group_id: "127ecc830d98f9d54a42c4f0842aa87e181a",
            protocol_type: ["QUIC","HTTP3"],
            time_format: "relative",
            reference_time: "1553986553572",

            time: 7,
            name: "http:frame_parsed",
            data: { ... }
        }
    ]
}

JSON serialization with repeated field values extracted to common_fields:

{
    common_fields: {
        group_id: "127ecc830d98f9d54a42c4f0842aa87e181a",
        protocol_type: ["QUIC","HTTP3"],
        time_format: "relative",
        reference_time: "1553986553572"
    },
    events: [
        {
            time: 2,
            name: "transport:packet_received",
            data: { ... }
        },{
            7,
            name: "http:frame_parsed",
            data: { ... }
        }
    ]
}
]]></artwork></figure>

<t>The “common_fields” field is a generic dictionary of key-value pairs, where the
key is always a string and the value can be of any type, but is typically also a
string or number. As such, unknown entries in this dictionary MUST be disregarded
by the user and tools (i.e., the presence of an uknown field is explicitly NOT an
error).</t>

<t>The list of default qlog fields that are typically logged in common_fields (as
opposed to as individual fields per event instance) are:</t>

<t><list style="symbols">
  <t>time_format</t>
  <t>reference_time</t>
  <t>protocol_type</t>
  <t>group_id</t>
</list></t>

<t>Tools MUST be able to deal with these fields being defined either on each event
individually or combined in common_fields. Note that if at least one event in a
trace has a different value for a given field, this field MUST NOT be added to
common_fields but instead defined on each event individually. Good example of such
fields are “time” and “data”, who are divergent by nature.</t>

</section>
</section>
</section>
<section anchor="guidelines-for-event-definition-documents" title="Guidelines for event definition documents">

<t>This document only defines the main schema for the qlog format. This is intended
to be used together with specific, per-protocol event definitions that specify the
name (category + type) and data needed for each individual event. This is with the
intent to allow the qlog main schema to be easily re-used for several protocols.
Examples include the QUIC event definitions <xref target="QLOG-QUIC"></xref> and HTTP/3 and QPACK
event definitions <xref target="QLOG-H3"></xref>.</t>

<t>This section defines some basic annotations and concepts the creators of event
definition documents SHOULD follow to ensure a measure of consistency, making it
easier for qlog implementers to extrapolate from one protocol to another.</t>

<section anchor="event-design-guidelines" title="Event design guidelines">

<t>TODO: pending QUIC working group discussion. This text reflects the initial (qlog
draft 01 and 02) setup.</t>

<t>There are several ways of defining qlog events. In practice, we have seen two main
types used so far: a) those that map directly to concepts seen in the protocols
(e.g., <spanx style="verb">packet_sent</spanx>) and b) those that act as aggregating events that combine
data from several possible protocol behaviours or code paths into one (e.g.,
<spanx style="verb">parameters_set</spanx>). The latter are typically used as a means to reduce the amount
of unique event definitions, as reflecting each possible protocol event as a
separate qlog entity would cause an explosion of event types.</t>

<t>Additionally, logging duplicate data is typically prevented as much as possible.
For example, packet header values that remain consistent across many packets are
split into separate events (for example <spanx style="verb">spin_bit_updated</spanx> or
<spanx style="verb">connection_id_updated</spanx> for QUIC).</t>

<t>Finally, we have typically refrained from adding additional state change events if
those state changes can be directly inferred from data on the wire (for example
flow control limit changes) if the implementation is bug-free and spec-compliant.
Exceptions have been made for common events that benefit from being easily
identifiable or individually logged (for example <spanx style="verb">packets_acked</spanx>).</t>

</section>
<section anchor="event-importance-indicators" title="Event importance indicators">

<t>Depending on how events are designed, it may be that several events allow the
logging of similar or overlapping data. For example the separate QUIC
<spanx style="verb">connection_started</spanx> event overlaps with the more generic
<spanx style="verb">connection_state_updated</spanx>. In these cases, it is not always clear which event
should be logged or used, and which event should take precedence if e.g., both are
present and provide conflicting information.</t>

<t>To aid in this decision making, we recommend that each event SHOULD have an
“importance indicator” with one of three values, in decreasing order of importance
and exptected usage:</t>

<t><list style="symbols">
  <t>Core</t>
  <t>Base</t>
  <t>Extra</t>
</list></t>

<t>The “Core” events are the events that SHOULD be present in all qlog files for a
given protocol. These are typically tied to basic packet and frame parsing and
creation, as well as listing basic internal metrics. Tool implementers SHOULD
expect and add support for these events, though SHOULD NOT expect all Core events
to be present in each qlog trace.</t>

<t>The “Base” events add additional debugging options and CAN be present in qlog
files. Most of these can be implicitly inferred from data in Core events (if those
contain all their properties), but for many it is better to log the events
explicitly as well, making it clearer how the implementation behaves. These events
are for example tied to passing data around in buffers, to how internal state
machines change and help show when decisions are actually made based on received
data. Tool implementers SHOULD at least add support for showing the contents of
these events, if they do not handle them explicitly.</t>

<t>The “Extra” events are considered mostly useful for low-level debugging of the
implementation, rather than the protocol. They allow more fine-grained tracking of
internal behaviour. As such, they CAN be present in qlog files and tool
implementers CAN add support for these, but they are not required to.</t>

<t>Note that in some cases, implementers might not want to log for example data
content details in the “Core” events due to performance or privacy considerations.
In this case, they SHOULD use (a subset of) relevant “Base” events instead to
ensure usability of the qlog output. As an example, implementations that do not
log QUIC <spanx style="verb">packet_received</spanx> events and thus also not which (if any) ACK frames the
packet contains, SHOULD log <spanx style="verb">packets_acked</spanx> events instead.</t>

<t>Finally, for event types whose data (partially) overlap with other event types’
definitions, where necessary the event definition document should include explicit
guidance on which to use in specific situations.</t>

</section>
<section anchor="custom-fields-1" title="Custom fields">

<t>Event definition documents are free to define new category and event types,
top-level fields (e.g., a per-event field indicating its privacy properties or
path_id in multipath protocols), as well as values for the “trigger” property
within the “data” field, or other member fields of the “data” field, as they see
fit.</t>

<t>They however SHOULD NOT expect non-specialized tools to recognize or visualize
this custom data. However, tools SHOULD make an effort to visualize even unknown
data if possible in the specific tool’s context. If they do not, they MUST ignore
these unknown fields.</t>

</section>
</section>
<section anchor="generic-events-and-data-classes" title="Generic events and data classes">

<t>There are some event types and data classes that are common across protocols,
applications and use cases that benefit from being defined in a single location.
This section specifies such common definitions.</t>

<section anchor="raw-packet-and-frame-information" title="Raw packet and frame information">

<t>While qlog is a more high-level logging format, it also allows the inclusion of
most raw wire image information, such as byte lengths and even raw byte values.
This can be useful when for example investigating or tuning packetization
behaviour or determining encoding/framing overheads. However, these fields are not
always necessary and can take up considerable space if logged for each packet or
frame. They can also have a considerable privacy and security impact. As such,
they are grouped in a separate optional field called “raw” of type RawInfo (where
applicable).</t>

<figure><artwork><![CDATA[
class RawInfo {
    length?:uint64; // the full byte length of the entity (e.g., packet or frame) including headers and trailers
    payload_length?:uint64; // the byte length of the entity's payload, without headers or trailers

    data?:bytes; // the contents of the full entity, including headers and trailers
}
]]></artwork></figure>

<t><list style="hanging">
  <t hangText='Note:'>
  The RawInfo:data field can be truncated for privacy or security purposes
(for example excluding payload data). In this case, the length properties should
still indicate the non-truncated lengths.</t>
  <t hangText='Note:'>
  We do not specify explicit header_length or trailer_length fields. In
most protocols, header_length can be calculated by subtracing the payload_length
from the length (e.g., if trailer_length is always 0). In protocols with trailers
(e.g., QUIC’s AEAD tag), event definitions documents SHOULD define other ways of
logging the trailer_length to make the header_length calculation possible.</t>
  <t>The exact definitions entities, headers, trailers and payloads depend on the
protocol used. If this is non-trivial, event definitions documents SHOULD include
a clear explanation of how entities are mapped into the RawInfo structure.</t>
  <t hangText='Note:'>
  Relatedly, many modern protocols use Variable-Length Integer Encoded (VLIE) values
in their headers, which are of a dynamic length. Because of this, we cannot
deterministally reconstruct the header encoding/length from non-RawInfo qlog data,
as implementations might not necessarily employ the most efficient VLIE scheme for
all values. As such, to make exact size-analysis possible, implementers should use
explicit lengths in RawInfo rather than reconstructing them from other qlog data.
Similarly, tool developers should only utilize RawInfo (and related information)
in such tools to prevent errors.</t>
</list></t>

</section>
<section anchor="generic-events" title="Generic events">

<t>In typical logging setups, users utilize a discrete number of well-defined logging
categories, levels or severities to log freeform (string) data. This generic
events category replicates this approach to allow implementations to fully replace
their existing text-based logging by qlog. This is done by providing events to log
generic strings for the typical well-known logging levels (error, warning, info,
debug, verbose).</t>

<t>For the events defined below, the “category” is “generic” and their “type” is the
name of the heading in lowercase (e.g., the “name” of the error event is
“generic:error”).</t>

<section anchor="error" title="error">
<t>Importance: Core</t>

<t>Used to log details of an internal error that might not get reflected on the wire.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    code?:uint32,
    message?:string
}
]]></artwork></figure>

</section>
<section anchor="warning" title="warning">
<t>Importance: Base</t>

<t>Used to log details of an internal warning that might not get reflected on the
wire.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    code?:uint32,
    message?:string
}
]]></artwork></figure>

</section>
<section anchor="info" title="info">
<t>Importance: Extra</t>

<t>Used mainly for implementations that want to use qlog as their one and only
logging format but still want to support unstructured string messages.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    message:string
}
]]></artwork></figure>

</section>
<section anchor="debug" title="debug">
<t>Importance: Extra</t>

<t>Used mainly for implementations that want to use qlog as their one and only
logging format but still want to support unstructured string messages.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    message:string
}
]]></artwork></figure>

</section>
<section anchor="verbose" title="verbose">
<t>Importance: Extra</t>

<t>Used mainly for implementations that want to use qlog as their one and only
logging format but still want to support unstructured string messages.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    message:string
}
]]></artwork></figure>

</section>
</section>
<section anchor="simulation-events" title="Simulation events">

<t>When evaluating a protocol implementation, one typically sets up a series of
interoperability or benchmarking tests, in which the test situations can change
over time. For example, the network bandwidth or latency can vary during the test,
or the network can be fully disable for a short time. In these setups, it is
useful to know when exactly these conditions are triggered, to allow for proper
correlation with other events.</t>

<t>For the events defined below, the “category” is “simulation” and their “type” is
the name of the heading in lowercase (e.g., the “name” of the scenario event is
“simulation:scenario”).</t>

<section anchor="scenario" title="scenario">
<t>Importance: Extra</t>

<t>Used to specify which specific scenario is being tested at this particular
instance. This could also be reflected in the top-level qlog’s <spanx style="verb">summary</spanx> or
<spanx style="verb">configuration</spanx> fields, but having a separate event allows easier aggregation of
several simulations into one trace (e.g., split by <spanx style="verb">group_id</spanx>).</t>

<figure><artwork><![CDATA[
{
    name?:string,
    details?:any
}
]]></artwork></figure>

</section>
<section anchor="marker" title="marker">
<t>Importance: Extra</t>

<t>Used to indicate when specific emulation conditions are triggered at set times
(e.g., at 3 seconds in 2% packet loss is introduced, at 10s a NAT rebind is
triggered).</t>

<figure><artwork><![CDATA[
{
    type?:string,
    message?:string
}
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="concrete-formats" title="Serializing qlog">

<t>This document and other related qlog schema definitions are intentionally
serialization-format agnostic. This means that implementers themselves can choose
how to represent and serialize qlog data practically on disk or on the wire. Some
examples of possible formats are JSON, CBOR, CSV, protocol buffers, flatbuffers,
etc.</t>

<t>All these formats make certain tradeoffs between flexibility and efficiency, with
textual formats like JSON typically being more flexible but also less efficient
than binary formats like protocol buffers. The format choice will depend on the
practical use case of the qlog user. For example, for use in day to day debugging,
a plaintext readable (yet relatively large) format like JSON is probably
preferred. However, for use in production, a more optimized yet restricted format
can be better. In this latter case, it will be more difficult to achieve
interoperability between qlog implementations of various protocol stacks, as some
custom or tweaked events from one might not be compatible with the format of the
other. This will also reflect in tooling: not all tools will support all formats.</t>

<t>This being said, the authors prefer JSON as the basis for storing qlog, as it
retains full flexibility and maximum interoperability. Storage overhead can be
managed well in practice by employing compression. For this reason, this document
details both how to practically transform qlog schema definitions to JSON and to
the streamable NDJSON. We discuss concrete options to bring down JSON size and
processing overheads in <xref target="optimizations"/>.</t>

<t>As depending on the employed format different deserializers/parsers should be
used, the “qlog_format” field is used to indicate the chosen serialization
approach. This field is always a string, but can be made hierarchical by the use
of the “.” separator between entries. For example, a value of “JSON.optimizationA”
can indicate that a default JSON format is being used, but that a certain
optimization of type A was applied to the file as well (see also
<xref target="optimizations"/>).</t>

<section anchor="format-json" title="qlog to JSON mapping">

<t>When mapping qlog to normal JSON, the “qlog_format” field MUST have the value
“JSON”. This is also the default qlog serialization and default value of this field.</t>

<t>To facilitate this mapping, the qlog documents employ a format that is close to
pure JSON for its examples and data definitions. Still, as JSON is not a typed
format, there are some practical peculiarities to observe.</t>

<section anchor="numbers" title="numbers">

<t>While JSON has built-in support for integers up to 64 bits in size, not all JSON
parsers do. For example, none of the major Web browsers support full 64-bit
integers at this time, as all numerical values (both floating-point numbers and
integers) are internally represented as floating point <eref target="https://en.wikipedia.org/wiki/Floating-point_arithmetic">IEEE
754</eref> values. In practice,
this limits their integers to a maximum value of 2^53-1. Integers larger than that
are either truncated or produce a JSON parsing error. While this is expected to
improve in the future (as <eref target="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt">“BigInt”
support</eref>
has been introduced in most Browsers, though not yet integrated into JSON
parsers), we still need to deal with it here.</t>

<t>When transforming an int64, uint64 or double from qlog to JSON, the implementer
can thus choose to either log them as JSON numbers (taking the risk of truncation
or un-parseability) or to log them as strings instead. Logging as strings should
however only be practically needed if the value is likely to exceed 2^53-1. In
practice, even though protocols such as QUIC allow 64-bit values for for example
stream identifiers, these high numbers are unlikely to be reached for the
overwhelming majority of cases. As such, it is probably a valid trade-off to take
the risk and log 64-bit values as JSON numbers instead of strings.</t>

<t>Tools processing JSON-based qlog SHOULD however be able to deal with 64-bit fields
being serialized as either strings or numbers.</t>

</section>
<section anchor="bytes" title="bytes">

<t>Unlike most binary formats, JSON does not allow the logging of raw binary blobs
directly. As such, when serializing a byte or array&lt;byte&gt;, a scheme needs to
be chosen.</t>

<t>To represent qlog bytes in JSON, they MUST be serialized to their lowercase
hexadecimal equivalents (with 0 prefix for values lower than 10). All values are
directly appended to each other, without delimiters. The full value is not
prefixed with 0x (as is sometimes common). An example is given in
<xref target="json-bytes-example"/>.</t>

<figure title="Example for serializing bytes" anchor="json-bytes-example"><artwork type="json"><![CDATA[
For the five raw unsigned byte input values of: 5 20 40 171 255, the JSON serialization is:

{
    raw: "051428abff"
}
]]></artwork></figure>

<t>As such, the resulting string will always have an even amount of characters and
the original byte-size can be retrieved by dividing the string length by 2.</t>

<section anchor="truncated-values" title="Truncated values">

<t>In some cases, it can be interesting not to log a full raw blob but instead a
truncated value (for example, only the first 100 bytes of an HTTP response body to
be able to discern which file it actually contained). In these cases, the original
byte-size length cannot be obtained from the serialized value directly. As such,
all qlog schema definitions SHOULD include a separate, length-indicating field for
all fields of type array&lt;byte&gt; they specify. This allows always retrieving
the original length, but also allows the omission of any raw value bytes of the
field completely (e.g., out of privacy or security considerations).</t>

<t>To reduce overhead however and in the case the full raw value is logged, the extra
length-indicating field can be left out. As such, tools MUST be able to deal with
this situation and derive the length of the field from the raw value if no
separate length-indicating field is present. All possible permutations are shown
by example in <xref target="json-bytes-example-two"/>.</t>

<figure title="Example for serializing truncated bytes" anchor="json-bytes-example-two"><artwork type="json"><![CDATA[
// both the full raw value and its length are present (length is redundant)
{
    "raw_length": 5,
    "raw": "051428abff"
}

// only the raw value is present, indicating it represents the fields full value
// the byte length is obtained by calculating raw.length / 2
{
    "raw": "051428abff"
}

// only the length field is present, meaning the value was omitted
{
    "raw_length": 5,
}

// both fields are present and the lengths do not match: the value was truncated to the first three bytes.
{
    "raw_length": 5,
    "raw": "051428"
}

]]></artwork></figure>

</section>
</section>
<section anchor="summarizing-table" title="Summarizing table">

<t>By definition, JSON strings are serialized surrounded by quotes. Numbers without.</t>

<texttable>
      <ttcol align='left'>qlog type</ttcol>
      <ttcol align='left'>JSON type</ttcol>
      <c>int8</c>
      <c>number</c>
      <c>int16</c>
      <c>number</c>
      <c>int32</c>
      <c>number</c>
      <c>uint8</c>
      <c>number</c>
      <c>uint16</c>
      <c>number</c>
      <c>uint32</c>
      <c>number</c>
      <c>float</c>
      <c>number</c>
      <c>int64</c>
      <c>number or string</c>
      <c>uint64</c>
      <c>number or string</c>
      <c>double</c>
      <c>number or string</c>
      <c>bytes</c>
      <c>string (lowercase hex value)</c>
      <c>string</c>
      <c>string</c>
      <c>boolean</c>
      <c>string (“true” or “false”)</c>
      <c>enum</c>
      <c>string (full value/name, not index)</c>
      <c>any</c>
      <c>object  ( {…} )</c>
      <c>array</c>
      <c>array   ( […] )</c>
</texttable>

</section>
<section anchor="other-json-specifics" title="Other JSON specifics">

<t>JSON files by definition (<xref target="RFC8259"/>) MUST utilize the UTF-8 encoding, both for
the file itself and the string values.</t>

<t>Most JSON parsers strictly follow the JSON specification. This includes the rule
that trailing comma’s are not allowed. As it is frequently annoying to remove
these trailing comma’s when logging events in a streaming fashion, tool
implementers SHOULD allow the last event entry of a qlog trace to be an empty
object. This allows loggers to simply close the qlog file by appending “{}]}]}”
after their last added event.</t>

<t>Finally, while not specifically required by the JSON specification, all qlog field
names in a JSON serialization MUST be lowercase.</t>

</section>
</section>
<section anchor="format-ndjson" title="qlog to NDJSON mapping">

<t>One of the downsides of using pure JSON is that it is inherently a non-streamable
format. Put differently, it is not possible to simply append new qlog events to a
log file without “closing” this file at the end by appending “]}]}”. Without these
closing tags, most JSON parsers will be unable to parse the file entirely. As most
platforms do not provide a standard streaming JSON parser (which would be able to
deal with this problem), this document also provides a qlog mapping to a
streamable JSON format called <eref target="http://ndjson.org/">Newline-Delimited JSON
(NDJSON)</eref>.</t>

<t>When mapping qlog to NDJSON, the “qlog_format” field MUST have the value “NDJSON”.</t>

<t>NDJSON is very similar to JSON, except that it interprets each line in a file as a
fully separate JSON object. Put differently, unlike default JSON, it does not
require a file to be wrapped as a full object with “{ … }” or “[ … ]”. Using
this setup, qlog events can simply be appended as individually serialized lines at
the back of a streamed logging file.</t>

<t>For this to work, some qlog definitions have to be adjusted however. Mainly,
events are no longer part of the “events” array in the Trace object, but are
instead logged separately from the qlog “file header” (QlogFile class in
<xref target="top-level"/>). Additionally, qlog’s NDJSON mapping does not allow logging
multiple individual traces in a single qlog file. As such, the QlogFile:traces
field is replaced by the singular “trace” field, which simply contains the Trace
data directly. An example can be seen in <xref target="ndjson-example"/>. Note that the
“group_id” field can still be used on a per-event basis to include events from
conceptually different sources in a single NDJSON qlog file.</t>

<t>Note as well from <xref target="ndjson-example"/> that the file’s header (QlogFileNDJSON) also
needs to be fully serialized on a single line to be NDJSON compatible.</t>

<figure title="Top-level element" anchor="ndjson-example"><artwork type="json"><![CDATA[
Definition:

class QlogFileNDJSON {
    qlog_format: "NDJSON",

    qlog_version:string,
    title?:string,
    description?:string,
    summary?: Summary,
    trace: Trace
}
// list of qlog events, separated by newlines

NDJSON serialization:

{"qlog_format":"NDJSON","qlog_version":"draft-03-WIP","title":"Name of this particular NDJSON qlog file (short)","description":"Description for this NDJSON qlog file (long)","trace":{"common_fields":{"protocol_type": ["QUIC","HTTP3"],"group_id":"127ecc830d98f9d54a42c4f0842aa87e181a","time_format":"relative","reference_time":"1553986553572"},"vantage_point":{"name":"backend-67","type":"server"}}}
{"time": 2, "name": "transport:packet_received", "data": { ... } }
{"time": 7, "name": "http:frame_parsed", "data": { ... } }
]]></artwork></figure>

<t>Finally, while not specifically required by the NDJSON specification, all qlog
field names in a NDJSON serialization MUST be lowercase.</t>

<section anchor="supporting-ndjson-in-tooling" title="Supporting NDJSON in tooling">

<t>Note that NDJSON is not supported in most default programming environments (unlike
normal JSON). However, several <eref target="http://ndjson.org/libraries.html">custom NDJSON parsing libraries
exist</eref> that can be used and the format is easy
enough to parse with existing implementations (i.e., by splitting the file into
its component lines and feeding them to a normal JSON parser individually, as each
line by itself is a valid JSON object).</t>

</section>
</section>
<section anchor="optimizations" title="Other optimizated formatting options">

<t>Both the JSON and NDJSON formatting options described above are serviceable in
general small to medium scale (debugging) setups. However, these approaches tend
to be relatively verbose, leading to larger file sizes. Additionally, generalized
(ND)JSON (de)serialization performance is typically (slightly) lower than that of
more optimized and predictable formats. Both aspects make these formats more
challenging (<eref target="https://qlog.edm.uhasselt.be/anrw/">though still practical</eref>) to use
in large scale setups.</t>

<t>During the development of qlog, we compared a multitude of alternative formatting
and optimization options. The results of this study are <eref target="https://github.com/quiclog/internet-drafts/issues/30#issuecomment-617675097">summarized on the qlog
github
repository</eref>.
The rest of this section discusses some of these approaches implementations could
choose and the expected gains and tradeoffs inherent therein. Tools SHOULD support
mainly the compression options listed in <xref target="compression"/>, as they provide the
largest wins for the least cost overall.</t>

<t>Over time, specific qlog formats and encodings can be created that more formally
define and combine some of the discussed optimizations or add new ones. We choose
to define these schemes in separate documents to keep the main qlog definition
clean and generalizable, as not all contexts require the same performance or
flexibility as others and qlog is intended to be a broadly usable and extensible
format (for example more flexibility is needed in earlier stages of protocol
development, while more performance is typically needed in later stages). This is
also the main reason why the general qlog format is the less optimized JSON
instead of a more performant option.</t>

<t>To be able to easily distinguish between these options in qlog compatible tooling
(without the need to have the user provide out-of-band information or to
(heuristically) parse and process files in a multitude of ways, see also
<xref target="tooling"/>), we recommend using explicit file extensions to indicate specific
formats. As there are no standards in place for this type of extension to format
mapping, we employ a commonly used scheme here. Our approach is to list the
applied optimizations in the extension in ascending order of application (e.g., if
a qlog file is first optimized with technique A and then compressed with technique
B, the resulting file would have the extension “.qlog.A.B”). This allows tooling
to start at the back of the extension to “undo” applied optimizations to finally
arrive at the expected qlog representation.</t>

<section anchor="structure-optimizations" title="Data structure optimizations">

<t>The first general category of optimizations is to alter the representation of data
within an (ND)JSON qlog file to reduce file size.</t>

<t>The first option is to employ a scheme similar to the CSV (comma separated value
<xref target="rfc4180"/>) format, which utilizes the concept of column “headers” to prevent
repeating field names for each datapoint instance. Concretely for JSON qlog,
several field names are repeated with each event (i.e., time, name, data). These
names could be extracted into a separate list, after which qlog events could be
serialized as an array of values, as opposed to a full object. This approach was a
key part of the original qlog format (prior to draft 02) using the “event_fields”
field. However, tests showed that this optimization only provided a mean file size
reduction of 5% (100MB to 95MB) while significantly increasing the implementation
complexity, and this approach was abandoned in favor of the default JSON setup.
Implementations using this format should not employ a separate file extension (as
it still uses JSON), but rather employ a new value of “JSON.namedheaders” (or
“NDJSON.namedheaders”) for the “qlog_format” field (see <xref target="top-level"/>).</t>

<t>The second option is to replace field values and/or names with indices into a
(dynamic) lookup table. This is a common compression technique and can provide
significant file size reductions (up to 50% in our tests, 100MB to 50MB). However,
this approach is even more difficult to implement efficiently and requires either
including the (dynamic) table in the resulting file (an approach taken by for
example <eref target="https://www.chromium.org/developers/design-documents/network-stack/netlog">Chromium’s NetLog
format</eref>)
or defining a (static) table up-front and sharing this between implementations.
Implementations using this approach should not employ a separate file extension
(as it still uses JSON), but rather employ a new value of “JSON.dictionary” (or
“NDJSON.dictionary”) for the “qlog_format” field (see <xref target="top-level"/>).</t>

<t>As both options either proved difficult to implement, reduced qlog file
readability, and provided too little improvement compared to other more
straightforward options (for example <xref target="compression"/>), these schemes are not
inherently part of qlog.</t>

</section>
<section anchor="compression" title="Compression">

<t>The second general category of optimizations is to utilize a (generic) compression
scheme for textual data. As qlog in the (ND)JSON format typically contains a large
amount of repetition, off-the-shelf (text) compression techniques typically
succeed very well in bringing down file sizes (regularly with up to two orders of
magnitude in our tests, even for “fast” compression levels). As such, utilizing
compression is recommended before attempting other optimization options, even
though this might (somewhat) increase processing costs due to the additional
compression step.</t>

<t>The first option is to use GZIP compression (<xref target="RFC1952"/>). This generic
compression scheme provides multiple compression levels (providing a trade-off
between compression speed and size reduction). Utilized at level 6 (a medium
setting thought to be applicable for streaming compression of a qlog stream in
commodity devices), gzip compresses qlog JSON files to 7% of their initial size on
average (100MB to 7MB). For this option, the file extension .qlog.gz SHOULD BE
used.  The “qlog_format” field should still reflect the original JSON formatting
of the qlog data (e.g., “JSON” or “NDJSON”).</t>

<t>The second option is to use Brotli compression (<xref target="RFC7932"/>). While similar to
gzip, this more recent compression scheme provides a better efficiency. It also
allows multiple compression levels. Utilized at level 4 (a medium setting thought
to be applicable for streaming compression of a qlog stream in commodity devices),
brotli compresses qlog JSON files to 7% of their initial size on average (100MB to
7MB). For this option, the file extension .qlog.br SHOULD BE used. The
“qlog_format” field should still reflect the original JSON formatting of the qlog
data (e.g., “JSON” or “NDJSON”).</t>

<t>Other compression algorithms of course exist (for example xz, zstd, and lz4). We
mainly recommend gzip and brotli because of their tweakable behaviour and wide
support in web-based environments, which we envision as the main tooling ecosystem
(see also <xref target="tooling"/>).</t>

</section>
<section anchor="binary" title="Binary formats">

<t>The third general category of optimizations is to use a more optimized (often
binary) format instead of the textual JSON format. This approach inherently
produces smaller files and often has better (de)serialization performance.
However, the resultant files are no longer human readable and some formats require
hard tradeoffs between flexibility for performance.</t>

<t>The first option is to use the CBOR (Concise Binary Object Representation
<xref target="rfc7049"/>) format. For our purposes, CBOR can be viewed as a straighforward
binary variant of JSON. As such, existing JSON qlog files can be trivially
converted to and from CBOR (though slightly more work is needed for NDJSON qlogs).
While CBOR thus does retain the full qlog flexibility, it only provides a 25% file
size reduction (100MB to 75MB) compared to textual (ND)JSON. As CBOR support in
programming environments is not as widespread as that of textual JSON and the
format lacks human readability, CBOR was not chosen as the default qlog format.
For this option, the file extension .qlog.cbor SHOULD BE used. The “qlog_format”
field should still reflect the original JSON formatting of the qlog data (e.g.,
“JSON” or “NDJSON”).</t>

<t>A second option is to use a more specialized binary format, such as <eref target="https://developers.google.com/protocol-buffers">Protocol
Buffers</eref> (protobuf). This format
is battle-tested, has support for optional fields and has libraries in most
programming languages. Still, it is significantly less flexible than textual JSON
or CBOR, as it relies on a separate, pre-defined schema (a .proto file). As such,
it it not possible to (easily) log new event types in protobuf files without
adjusting this schema as well, which has its own practical challenges. As qlog is
intended to be a flexible, general purpose format, this type of format was not
chosen as its basic serialization. The lower flexibility does lead to
significantly reduced file sizes. Our straightforward mapping of the qlog main
schema and QUIC/HTTP3 event types to protobuf created qlog files 24% as large as
the raw JSON equivalents (100MB to 24MB). For this option, the file extension
.qlog.protobuf SHOULD BE used. The “qlog_format” field should reflect the
different internal format, for example: “qlog_format”: “protobuf”.</t>

<t>Note that binary formats can (and should) also be used in conjunction with
compression (see <xref target="compression"/>). For example, CBOR compresses well (to about 6%
of the original textual JSON size (100MB to 6MB) for both gzip and brotli) and so
does protobuf (5% (gzip) to 3% (brotli)). However, these gains are similar to the
ones achieved by simply compression the textual JSON equivalents directly (7%, see
<xref target="compression"/>). As such, since compression is still needed to achieve optimal
file size reductions event with binary formats, we feel the more flexible
compressed textual JSON options are a better default for the qlog format in
general.</t>

<t></t>

</section>
<section anchor="format-summary" title="Overview and summary">

<t>In summary, textual JSON was chosen as the main qlog format due to its high
flexibility and because its inefficiencies can be largely solved by the
utilization of compression techniques (which are needed to achieve optimal results
with other formats as well).</t>

<t>Still, qlog implementers are free to define other qlog formats depending on their
needs and context of use. These formats should be described in their own
documents, the discussion in this document mainly acting as inspiration and
high-level guidance. Implementers are encouraged to add concrete qlog formats and
definitions to <eref target="https://github.com/quiclog/qlog">the designated public
repository</eref>.</t>

<t>The following table provides an overview of all the discussed qlog formatting
options with examples:</t>

<texttable>
      <ttcol align='left'>format</ttcol>
      <ttcol align='left'>qlog_format</ttcol>
      <ttcol align='left'>extension</ttcol>
      <c>JSON <xref target="format-json"/></c>
      <c>JSON</c>
      <c>.qlog</c>
      <c>NDJSON  <xref target="format-ndjson"/></c>
      <c>NDJSON</c>
      <c>.qlog</c>
      <c>named headers <xref target="structure-optimizations"/></c>
      <c>(ND)JSON.namedheaders</c>
      <c>.qlog</c>
      <c>dictionary <xref target="structure-optimizations"/></c>
      <c>(ND)JSON.dictionary</c>
      <c>.qlog</c>
      <c>CBOR <xref target="binary"/></c>
      <c>(ND)JSON</c>
      <c>.qlog.cbor</c>
      <c>protobuf <xref target="binary"/></c>
      <c>protobuf</c>
      <c>.qlog.protobuf</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>gzip <xref target="compression"/></c>
      <c>no change</c>
      <c>.gz suffix</c>
      <c>brotli <xref target="compression"/></c>
      <c>no change</c>
      <c>.br suffix</c>
</texttable>

</section>
</section>
<section anchor="conversion" title="Conversion between formats">

<t>As discussed in the previous sections, a qlog file can be serialized in a
multitude of formats, each of which can conceivably be transformed into or from
one another without loss of information. For example, a number of NDJSON streamed
qlogs could be combined into a JSON formatted qlog for later processing.
Similarly, a captured binary qlog could be transformed to JSON for easier
interpretation and sharing.</t>

<t>Secondly, we can also consider other structured logging approaches that contain
similar (though typically not identical) data to qlog, like raw packet capture
files (for example .pcap files from tcpdump) or endpoint-specific logging formats
(for example the NetLog format in Google Chrome). These are sometimes the only
options, if an implementation cannot or will not support direct qlog output for
any reason, but does provide other internal or external (e.g., SSLKEYLOGFILE
export to allow decryption of packet captures) logging options For this second
category, a (partial) transformation from/to qlog can also be defined.</t>

<t>As such, when defining a new qlog serialization format or wanting to utilize
qlog-compatible tools with existing codebases lacking qlog support, it is
recommended to define and provide a concrete mapping from one format to default
JSON-serialized qlog. Several of such mappings exist. Firstly,
[pcap2qlog]((https://github.com/quiclog/pcap2qlog) transforms QUIC and HTTP/3
packet capture files to qlog. Secondly,
<eref target="https://github.com/quiclog/qvis/tree/master/visualizations/src/components/filemanager/netlogconverter">netlog2qlog</eref>
converts chromium’s internal dictionary-encoded JSON format to qlog. Finally,
<eref target="https://github.com/quiclog/quictrace2qlog">quictrace2qlog</eref> converts the older
quictrace format to JSON qlog. Tools can then easily integrate with these
converters (either by incorporating them directly or for example using them as a
(web-based) API) so users can provide different file types with ease. For example,
the <eref target="https://qvis.edm.uhasselt.be">qvis</eref> toolsuite supports a multitude of formats
and qlog serializations.</t>

</section>
</section>
<section anchor="methods-of-access-and-generation" title="Methods of access and generation">

<t>Different implementations will have different ways of generating and storing
qlogs. However, there is still value in defining a few default ways in which to
steer this generation and access of the results.</t>

<section anchor="set-file-output-destination-via-an-environment-variable" title="Set file output destination via an environment variable">

<t>To provide users control over where and how qlog files are created, we define two
environment variables. The first, QLOGFILE, indicates a full path to where an
individual qlog file should be stored. This path MUST include the full file
extension. The second, QLOGDIR, sets a general directory path in which qlog files
should be placed. This path MUST include the directory separator character at the
end.</t>

<t>In general, QLOGDIR should be preferred over QLOGFILE if an endpoint is prone to
generate multiple qlog files. This can for example be the case for a QUIC server
implementation that logs each QUIC connection in a separate qlog file. An
alternative that uses QLOGFILE would be a QUIC server that logs all connections in
a single file and uses the “group_id” field (<xref target="group-ids"/>) to allow post-hoc
separation of events.</t>

<t>Implementations SHOULD provide support for QLOGDIR and MAY provide support for
QLOGFILE.</t>

<t>When using QLOGDIR, it is up to the implementation to choose an appropriate naming
scheme for the qlog files themselves. The chosen scheme will typically depend on
the context or protocols used. For example, for QUIC, it is recommended to use the
Original Destination Connection ID (ODCID), followed by the vantage point type of
the logging endpoint. Examples of all options for QUIC are shown in
<xref target="qlogdir-example"/>.</t>

<figure title="Environment variable examples for a QUIC implementation" anchor="qlogdir-example"><artwork type="json"><![CDATA[
Command: QLOGFILE=/srv/qlogs/client.qlog quicclientbinary

Should result in the the quicclientbinary executable logging a single qlog file named client.qlog in the /srv/qlogs directory.
This is for example useful in tests when the client sets up just a single connection and then exits.

Command: QLOGDIR=/srv/qlogs/ quicserverbinary

Should result in the quicserverbinary executable generating several logs files, one for each QUIC connection.
Given two QUIC connections, with ODCID values "abcde" and "12345" respectively, this would result in two files:
/srv/qlogs/abcde_server.qlog
/srv/qlogs/12345_server.qlog

Command: QLOGFILE=/srv/qlogs/server.qlog quicserverbinary

Should result in the the quicserverbinary executable logging a single qlog file named server.qlog in the /srv/qlogs directory.
Given that the server handled two QUIC connections before it was shut down, with ODCID values "abcde" and "12345" respectively,
this would result in event instances in the qlog file being tagged with the "group_id" field with values "abcde" and "12345".
]]></artwork></figure>

</section>
<section anchor="access-logs-via-a-well-known-endpoint" title="Access logs via a well-known endpoint">

<t>After generation, qlog implementers MAY make available generated logs and traces
on an endpoint (typically the server) via the following .well-known URI:</t>

<t><list style='empty'>
  <t>.well-known/qlog/IDENTIFIER.extension</t>
</list></t>

<t>The IDENTIFIER variable depends on the context and the protocol. For example for
QUIC, the lowercase Original Destination Connection ID (ODCID) is recommended, as
it can uniquely identify a connection. Additionally, the extension depends on the
chosen format (see <xref target="format-summary"/>). For example, for a QUIC connection with
ODCID “abcde”, the endpoint for fetching its default JSON-formatted .qlog file
would be:</t>

<t><list style='empty'>
  <t>.well-known/qlog/abcde.qlog</t>
</list></t>

<t>Implementers SHOULD allow users to fetch logs for a given connection on a 2nd,
separate connection. This helps prevent pollution of the logs by fetching them
over the same connection that one wishes to observe through the log. Ideally, for
the QUIC use case, the logs should also be approachable via an HTTP/2 or HTTP/1.1
endpoint (i.e., on TCP port 443), to for example aid debugging in the case where
QUIC/UDP is blocked on the network.</t>

<t>qlog implementers SHOULD NOT enable this .well-known endpoint in typical
production settings to prevent (malicious) users from downloading logs from other
connections. Implementers are advised to disable this endpoint by default and
require specific actions from the end users to enable it (and potentially qlog
itself). Implementers MUST also take into account the general privacy and security
guidelines discussed in <xref target="privacy"/> before exposing qlogs to outside actors.</t>

</section>
</section>
<section anchor="tooling" title="Tooling requirements">

<t>Tools ingestion qlog MUST indicate which qlog version(s), qlog format(s),
compression methods and potentially other input file formats (for example .pcap)
they support. Tools SHOULD at least support .qlog files in the default JSON format
(<xref target="format-json"/>). Additionally, they SHOULD indicate exactly which values for and
properties of the name (category and type) and data fields they look for to
execute their logic. Tools SHOULD perform a (high-level) check if an input qlog
file adheres to the expected qlog schema. If a tool determines a qlog file does
not contain enough supported information to correctly execute the tool’s logic, it
SHOULD generate a clear error message to this effect.</t>

<t>Tools MUST NOT produce breaking errors for any field names and/or values in the
qlog format that they do not recognize. Tools SHOULD indicate even unknown event
occurences within their context (e.g., marking unknown events on a timeline for
manual interpretation by the user).</t>

<t>Tool authors should be aware that, depending on the logging implementation, some
events will not always be present in all traces. For example, using a circular
logging buffer of a fixed size, it could be that the earliest events (e.g.,
connection setup events) are later overwritten by “newer” events. Alternatively,
some events can be intentionally omitted out of privacy or file size
considerations. Tool authors are encouraged to make their tools robust enough to
still provide adequate output for incomplete logs.</t>

</section>
<section anchor="privacy" title="Security and privacy considerations">

<t>TODO : discuss privacy and security considerations (e.g., what NOT to log, what to
strip out of a log before sharing, …)</t>

<t>TODO: strip out/don’t log IPs, ports, specific CIDs, raw user data, exact times,
HTTP HEADERS (or at least :path), SNI values</t>

<t>TODO: see if there is merit in encrypting the logs and having the server choose an
encryption key (e.g., sent in transport parameters)</t>

<t>Good initial reference: <eref target="https://huitema.wordpress.com/2020/07/21/scrubbing-quic-logs-for-privacy/">Christian Huitema’s
blogpost</eref></t>

</section>
<section anchor="iana-considerations" title="IANA Considerations">

<t>TODO: primarily the .well-known URI</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>

<reference anchor="QLOG-QUIC" >
  <front>
    <title>QUIC event definitions for qlog</title>
    <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
      <organization>KU Leuven</organization>
    </author>
    <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
      <organization>Facebook</organization>
    </author>
    <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
      <organization>Protocol Labs</organization>
    </author>
    <date />
  </front>
  <seriesInfo name="Internet-Draft" value="draft-marx-qlog-quic-events-00"/>
</reference>
<reference anchor="QLOG-H3" >
  <front>
    <title>HTTP/3 and QPACK event definitions for qlog</title>
    <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
      <organization>KU Leuven</organization>
    </author>
    <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
      <organization>Facebook</organization>
    </author>
    <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
      <organization>Protocol Labs</organization>
    </author>
    <date />
  </front>
  <seriesInfo name="Internet-Draft" value="draft-marx-qlog-h3-events-00"/>
</reference>


    </references>

    <references title='Informative References'>





<reference  anchor="RFC2119" target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference  anchor="RFC8259" target='https://www.rfc-editor.org/info/rfc8259'>
<front>
<title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
<author initials='T.' surname='Bray' fullname='T. Bray' role='editor'><organization /></author>
<date year='2017' month='December' />
<abstract><t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format.  It was derived from the ECMAScript Programming Language Standard.  JSON defines a small set of formatting rules for the portable representation of structured data.</t><t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t></abstract>
</front>
<seriesInfo name='STD' value='90'/>
<seriesInfo name='RFC' value='8259'/>
<seriesInfo name='DOI' value='10.17487/RFC8259'/>
</reference>



<reference  anchor="rfc4180" target='https://www.rfc-editor.org/info/rfc4180'>
<front>
<title>Common Format and MIME Type for Comma-Separated Values (CSV) Files</title>
<author initials='Y.' surname='Shafranovich' fullname='Y. Shafranovich'><organization /></author>
<date year='2005' month='October' />
<abstract><t>This RFC documents the format used for Comma-Separated Values (CSV) files and registers the associated MIME type &quot;text/csv&quot;.  This memo provides information for the Internet community.</t></abstract>
</front>
<seriesInfo name='RFC' value='4180'/>
<seriesInfo name='DOI' value='10.17487/RFC4180'/>
</reference>



<reference  anchor="RFC1952" target='https://www.rfc-editor.org/info/rfc1952'>
<front>
<title>GZIP file format specification version 4.3</title>
<author initials='P.' surname='Deutsch' fullname='P. Deutsch'><organization /></author>
<date year='1996' month='May' />
<abstract><t>This specification defines a lossless compressed data format that is compatible with the widely used GZIP utility.  This memo provides information for the Internet community.  This memo does not specify an Internet standard of any kind.</t></abstract>
</front>
<seriesInfo name='RFC' value='1952'/>
<seriesInfo name='DOI' value='10.17487/RFC1952'/>
</reference>



<reference  anchor="RFC7932" target='https://www.rfc-editor.org/info/rfc7932'>
<front>
<title>Brotli Compressed Data Format</title>
<author initials='J.' surname='Alakuijala' fullname='J. Alakuijala'><organization /></author>
<author initials='Z.' surname='Szabadka' fullname='Z. Szabadka'><organization /></author>
<date year='2016' month='July' />
<abstract><t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods.</t></abstract>
</front>
<seriesInfo name='RFC' value='7932'/>
<seriesInfo name='DOI' value='10.17487/RFC7932'/>
</reference>



<reference  anchor="rfc7049" target='https://www.rfc-editor.org/info/rfc7049'>
<front>
<title>Concise Binary Object Representation (CBOR)</title>
<author initials='C.' surname='Bormann' fullname='C. Bormann'><organization /></author>
<author initials='P.' surname='Hoffman' fullname='P. Hoffman'><organization /></author>
<date year='2013' month='October' />
<abstract><t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation.  These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t></abstract>
</front>
<seriesInfo name='RFC' value='7049'/>
<seriesInfo name='DOI' value='10.17487/RFC7049'/>
</reference>




    </references>


<section anchor="change-log" title="Change Log">

<section anchor="since-draft-marx-qlog-main-schema-draft-02" title="Since draft-marx-qlog-main-schema-draft-02:">

<t><list style="symbols">
  <t>These changes were done in preparation of the adoption of the drafts by the QUIC
working group (#137)</t>
  <t>Moved RawInfo, Importance, Generic events and Simulation events to this document.</t>
  <t>Added basic event definition guidelines</t>
  <t>Made protocol_type an array instead of a string (#146)</t>
</list></t>

</section>
<section anchor="since-draft-marx-qlog-main-schema-01" title="Since draft-marx-qlog-main-schema-01:">

<t><list style="symbols">
  <t>Decoupled qlog from the JSON format and described a mapping instead (#89)
  <list style="symbols">
      <t>Data types are now specified in this document and proper definitions for
fields were added in this format</t>
      <t>64-bit numbers can now be either strings or numbers, with a preference for
numbers (#10)</t>
      <t>binary blobs are now logged as lowercase hex strings (#39, #36)</t>
      <t>added guidance to add length-specifiers for binary blobs (#102)</t>
    </list></t>
  <t>Removed “time_units” from Configuration. All times are now in ms instead (#95)</t>
  <t>Removed the “event_fields” setup for a more straightforward JSON format
(#101,#89)</t>
  <t>Added a streaming option using the NDJSON format (#109,#2,#106)</t>
  <t>Described optional optimization options for implementers (#30)</t>
  <t>Added QLOGDIR and QLOGFILE environment variables, clarified the .well-known URL
usage (#26,#33,#51)</t>
  <t>Overall tightened up the text and added more examples</t>
</list></t>

</section>
<section anchor="since-draft-marx-qlog-main-schema-00" title="Since draft-marx-qlog-main-schema-00:">

<t><list style="symbols">
  <t>All field names are now lowercase (e.g., category instead of CATEGORY)</t>
  <t>Triggers are now properties on the “data” field value, instead of separate field
types (#23)</t>
  <t>group_ids in common_fields is now just also group_id</t>
</list></t>

</section>
</section>
<section anchor="design-variations" title="Design Variations">

<t><list style="symbols">
  <t><eref target="https://github.com/google/quic-trace">Quic-trace</eref> takes a slightly different
approach based on protocolbuffers.</t>
  <t><eref target="https://github.com/EricssonResearch/spindump">Spindump</eref> also defines a custom
text-based format for in-network measurements</t>
  <t><eref target="https://www.wireshark.org/">Wireshark</eref> also has a QUIC dissector and its
results can be transformed into a json output format using tshark.</t>
</list></t>

<t>The idea is that qlog is able to encompass the use cases for both of these
alternate designs and that all tooling converges on the qlog standard.</t>

</section>
<section anchor="acknowledgements" title="Acknowledgements">

<t>Much of the initial work by Robin Marx was done at Hasselt University.</t>

<t>Thanks to Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen Petrides, Jari
Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kühlewind, Jeremy Lainé and Lucas
Pardue for their feedback and suggestions.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAO8moGAAA+296ZYb2ZEm+P8+hR/wSBlQAYiFOzSqrEiSmQoVM0lxUXYN
K4fpADwiXATcIXdHBCMj2e/T79D/+sXa7DOzuzgQXHI0M+fUGdUpiQHf7mLX
1s/MxuOx68puWUyz7/Oyypb12VlZnWXt/LxY5dlp3WT/oN/cop5X+YruWjT5
aTde5c37MV+gf5XVWO4eH9x287wrzurmapq13cK5ct1Ms67ZtN3RwcHDgyOX
N0U+zV41edWu66Zzl3Xz7qypN+tp9tfXJ4/cu+KKflpMs5OqK5qq6MaP+YPO
tV1eLd7my7qiQVwVrVuX0+xNV89HGY2trBZF1Y2ylt7ZFKct/etqpf/omnJO
l+b1ap3rP1Z0M10qq2VZFT85l2+687qZuiwb0/9ndKGdZi8mtCTNe/wgc39R
z2iJ/I91czbN/v119rTYXBQVfqJVKJfTrOEbJ7xI//Zus8TlyazAHU3Na10s
yq5u0u89nWQ/lPN5TWMqo48+3czz3gV8+Nt8Xszq+l383WVl9/3b6WxCE/3E
J7+fZC8Leraqog/S/LqiSi7gg8+bmpa7XmZP81kbf3WFB/5trdcnebn9WVfV
zSrvyouCV/mvT599N+b9nuJOJcAB/5IVtFhdtihOaRZdWVetJ8IBbl4QhU2z
68fHr558wA9t0ZRFW1antbwt69HONs3+Y1POx/hOOz44wEOBAvg/Y/3fHZRw
IzXcQBE7NmDHF7b2/qP7v5sGPu9LvS3/6LZ/ZOu3N1h39c+30z3986tXz/dv
Z3R4s78+P3707/9v7O/57f9/d//Ju8vL7w+wG4/HGd3bNcRQnXt1XrbMhDcr
2dl23pSzos3y7Lw8Ox8vaS+WsUDJMzDzvFmUvxQLL3LkAyRBlkv6lTdykmV4
t1zJ6EJ92WZF3l5l7Xne8EP1KRNMDvrqzotsTvKFqYovNMWmzWfLwl2U7SZf
lr/IFb51Ucw28tWurpfthL5T7BgtUUCXTK5saSVoIRc0wq7OZkVmXG+cn1V1
25Vz3oF13hAV+8farF0X8/L0KjuvLzFMnVF7Xm+WC0ev2bT0Rl4cubOc+xdj
fjJAGxUt7bKt9SX+wyPMbJ5XNCzXFOumaOnb9FqaBb+5eJ+v1ssi+8vLZz+Q
FGwvaPflK7PN6UQ2dVUuFrRg7hafsaZebOa8ZLzFRVPwh+ebpqG3Lq9oF5f5
/B2vM32R9qSk32S9R+n+0mqta1o122gn455kTzBX2tUrjI/XhZaBZkD/xfvq
94jnVVzkyw1tIP25qhd0/LMfi5mzRWqNAEqaUtHgC9WcRlLyntHbmPgX5Skt
7GbZ8dbVs471HaJhmuOmETpsXXdO20JvvSgXRZYvin9seCM99deylF3evmuz
ZfkO+09TXtFxqTsaOk8gr/LlVVu2k/7RyMtVy9/2799BcjwPou2qaOlWHkw4
TzQ9d1ZURZMvae2v6k13w+qfs5aFf+ZnZ01xRgREf+HV6XyT7cBYd5yBNpBi
ILXLsjv3J5fmxiyal8Zt0a9sjW1sS8TJj4D/C23WNK8mOit7bVHEBOveeHXh
J/wONYFf+kYljvzclzTjpljmTP+QBS6SOEPsTJGd1bSStITdjTOPN4tGR48X
rTKQ05woyc1prYkJkojiddEtK/J5WJzTkpZeDjqpnhWobo8PuvxEZx+b09VO
rw5pBzf0ArwK+02ryd80fiY8q6ClksMuTI85Ej/Bvy2KfOlsi2hfmnpFxHZB
LLPornC26CgUfJBv2iZaoeMW4xj1WKCOsuV/zIt1J3dleZtdFE1Ly0uTHmWr
osvBmMtqvtzwzyNHY/EEyT+oKgD134453yMrRryDZqwcKOuK+XlV/mODkX1b
FIsZMx/sRNnON20Lzk486rJYkt5Li9q5N+ddt26n+/tntBIb6MP7rPrRN/ZL
UyGgO7Q/7X3+vUQ9LwpiDU2LD+YLEi8iDsjgIEqmfzArG4jo/KoV9WRAI5IN
ev3iqYjBKtusx109Zo3H6eJ5crT1puneupX9UHdYM6LXR3XFywbN6foWr/Hb
7mpdtB+EpsmAytiCarPB969fvhqM5H+zH57h3y+e0Ol58eQx//vln4+fPvX/
sDte/vnZ66d03em/wpOPnn3//ZMfHsvD3x//x0AkzuDZ81cnz344fjrYlpe8
QJCTEJsNySSmU6IV42rgANfXX7/49tHR4eHDDx9ovj+eMwHwGrISoKfxK1nt
LZnHK0nkv8hn5bIk4vaPeYZCB2G5BGXnkH1jIt512Yi8ZSm8J99/cHSXvj+M
WY8/68Y55Fjg/Xr2WDtl3YJeNyNORoT6vttAps02nchpmiHpknlzRWyzIKNp
vaxZfBLVdmSh8Q7yBkafIe5enW3yM5ZfNtZlXbcFv1Wm+Gbwip55SWu47gbO
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
I5enxgRfHGPcOySrl51BX1fxKcwzUpGn6kSGdDmOjQSTg3gED9P6fJ3cD5u0
KYk5ER28fnHCoWWxHS858N0Vq3Un5jhvVmaqGF6mrPQt+BS99m/y93OwLXq3
EEpy14cPU3WLR74q/hQcHrTUxbwTKJVfbN7lT8mwrTVhswHWFzQ+qEszpq1N
tTATgZaC79pvm4t92aj9rl7kV/vMJtpuAhih3pvMgY0KHAV6Wjj3IPvwcRkW
7bW3HMK+pqKLfVfqvKskgMmOO/gFwbVMyCfQi6AwbXMzh1BDI0FOBUYpYQzM
Raq298ggEBZMx/VxuWhBorcYy+V5tPAE74VlCIEwBWFAJBnnnSE7+P6Uq+T2
vMiV0+WmXPREaq4KzDwBvLCGpEugCECZL12virmYKckFA43pz05/XhV5u2nM
1UmS4SJf9p40j/8oK7p57OiSsbvggfbSDMZXhFghjWMhc1bur6ENM5vojDjj
Bf51WOwTYSLKoj2ajRgIayt+deANh5WGRdWR4+ukzbLvf7mkZSGGiyCGXjeL
ji2F5Cz2tsAwUqO+kGUB7Pysd+0HDYnllfggw+aI2NT4sleFLNgn50lFmDde
VJTCMW+k23nqWUmYa8Zya7GZMxiDQUpgfCqqywpG5EBUqLdiJQ1E8YAbKj3g
chg+4eAR8r2OfTXZjc6a5ArN5LQ8U+Warj2K/7ZbooHiFv77W/w52ma+Ke+V
G2RPzPnzhP/6pMfnky4bWfXf4K7RBxMnTbIOiatmwObcWwkNslFy9yDx3KTb
mDz47PGjk8c8inw2XxSHR7fv6NfCa4O3Kp8hglgMkrdvMfvwPMdl+UH2fxNb
Gd+7n7ydZMIgCIXkpbIbX+JsSllCIjai0FcqO24Rh05W1bkfC1ZlC9Xs5zC6
LKIZtBd4vUVtZVm5UQFQ0vqo54c1rtmVI65ZtRL+bkoxogB6jgC4l+wq8eA8
Dm7brT1jg3SSdcOxV0h8uSgsZFHQ/oo/gb/N+u6KDHJ2mrXncEazV5IO75w0
R0RbaRQSNiUW0vFX+dC3DLZM1bSya4vlaYg9iW2SrFkaCFBetOsOFV0XZXEp
SLTcYyy9BJA7sd4SbGXN8pRNGA20WlhaiHkU3Hg0xTE/IoyUows8pBk7Jdbs
8i7noizjtQ7oUqKF92KSkNRhPiixpPAhvA/gArn/QlCYHFNHVEKcEM4D2WO/
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
Uu8jzfLRFHy/DiOfWxu/ig+x7+0khkyoGW29aiDJJQKphateIWQgr5ibkz50
gwIyO0r85YNKshCBIlmMxKtrmT8plpUFKvyiyHCTKtQsDqNmNbFn2Y6IsQik
vaBPUOxy9VisWJ7srZtS0NXa3eFoqDwyeGnNOyLWc2x9cMo+cEGmu4D1pdps
tfS61ELbFgRCdKBMo+W7v8v2Dg8Ovv+Gx/Pw7vffDFXKMkwT5nwllZZ9Me4E
ji74cQGIvUcJNOFMW0vD8qfWUoen+UXdeG0qTj7S7hb9hry2OpKBx2uo+Vus
7ITjY/ufShj0HCqtnAP6A8K4F2e3FiHyL2HtrZdBxXS38Mdlj1QmdbWlV4ah
2OeOsAvSnnrOcG2+jbzslCWoSzptf0YruM8QaxwDyTFguVloynru9rQiFRt/
9TtOtGGdI8pqsqqRsXoepIqVMlTKcREFRA0YPfWwywS5PHcPfse7iobCUlDC
E9Rd+t/Ii+JSwiilE+SO3FRPXyFdeCnJlKrNGvbchYp7vPJhBbo8qi3ak4F7
fNZ9ASTuMC8dkRvLxc7ePDpv6lW5WXFwouieshsL2xkMu8vLy8lc74J/JxSi
2pfmBWOv0e9rfYsxMmX5LyKQ4dChLKV2a8m5nlPehbFv1uPTprYM8/O88WfA
1MWeZffRc+Pn+wUnx+1J8+rffHJCy7L03ES//5ZTc6x5rKYoaxoCkowWNxDS
SAXyIkhpJxndsEdGcVMEVMXN2Hu2BKvj94IYvZuBc+HwTbhCWsZcnJ1z8PmS
g8w2rsQC6hm9Q3MkmSloFUajyL5JEihmogE9ik4uOuf6NybM5HO1nFClbE+L
UQ1j5uBCcbjMsv+1LW5rbdjl3JkKZKmL3hyLGp/DoncBCM+KQKf4v/r0dEwv
Grfn7EDc448Nd7OpyNZz7WaOVCGEqi1ZGjnGPs04+NqyvaZAXI9GBe4p3Ith
jVDOUTJnlRPPg4mTcjTwqVMBVLVEnvHQpCTZMG7hh2VlnTm+D6FGNYpQJuYU
bYO7joEysBFS12jkPJEBOPWySSYpUuj32DFxSWrA0ER0Eaf9sKfEF2XnjQoN
GZKhkRW7vllB5SIF3/2fJ8+TWSva6vDh3SMEdpPyc8m7hYY8PsKHcbfXkFUj
qxSXh9QoZwwvee26UB9mKpZoKK+FqhfSl4CjG/e4mLy4eEntM684L2ZnTg1f
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

-->

</rfc>

