<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.17 (Ruby 3.0.2) -->
<?rfc docindent="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-quic-qlog-main-schema-07" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title>Main logging schema for qlog</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-07"/>
    <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
      <organization>Akamai</organization>
      <address>
        <email>rmarx@akamai.com</email>
      </address>
    </author>
    <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
      <organization>Meta</organization>
      <address>
        <email>lniccolini@meta.com</email>
      </address>
    </author>
    <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
      <organization>Protocol Labs</organization>
      <address>
        <email>martenseemann@gmail.com</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue" role="editor">
      <organization>Cloudflare</organization>
      <address>
        <email>lucaspardue.24.7@gmail.com</email>
      </address>
    </author>
    <date year="2023" month="October" day="23"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document defines qlog, an extensible high-level schema for a standardized
logging format. It allows easy sharing of data, benefitting common debug and
analysis methods and tooling. The high-level schema is independent of protocol;
separate documents extend qlog for protocol-specific data. The schema is also
independent of serialization format, allowing logs to be represented in many
ways such as JSON, CSV, or protobuf.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <ul empty="true">
        <li>
          <t>Note to RFC editor: Please remove this section before publication.</t>
        </li>
      </ul>
      <t>Feedback and discussion are welcome at
<eref target="https://github.com/quicwg/qlog">https://github.com/quicwg/qlog</eref>. Readers are
advised to refer to the "editor's draft" at that URL for an up-to-date version
of this document.</t>
      <t>Concrete examples of integrations of this schema in
various programming languages can be found at
<eref target="https://github.com/quiclog/qlog/">https://github.com/quiclog/qlog/</eref>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Endpoint logging is a useful strategy for capturing and understanding how
applications using network protocols are behaving, particularly where protocols
have an encrypted wire image that restricts observers' ability to see what is
happening.</t>
      <t>Many applications implement logging using a custom, non-standard logging format.
This has an effect on the tools and methods that are used to
analyze the logs, for example to perform root cause analysis of an
interoperability failure between distinct implementations. A lack of a common
format impedes the development of common tooling that can be used by all parties
that have access to logs.</t>
      <t>This document defines qlog, an extensible high-level schema and harness that
provides a shareable, aggregatable and structured logging format. This
high-level schema is independent of protocol, with logging entries for specific
protocols and use cases being defined in other documents (see for example
<xref target="QLOG-QUIC"/> for QUIC and <xref target="QLOG-H3"/> 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, qlog provides versioning, metadata inclusion, log aggregation, event
grouping and log file size reduction techniques.</t>
      <t>The qlog schema can be serialized in many ways (e.g., JSON, CBOR, protobuf,
etc). This document describes only how to employ <xref target="JSON"/>, its subset
<xref target="I-JSON"/>, and its streamable derivative
<xref target="JSON-Text-Sequences"/>.</t>
      <section anchor="data_types">
        <name>Notational Conventions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <section anchor="schema-definition">
          <name>Schema definition</name>
          <t>To define events and data structures, all qlog documents use the Concise
Data Definition Language <xref target="CDDL"/>. This document uses the basic
syntax, the specific <tt>text</tt>, <tt>uint</tt>, <tt>float32</tt>, <tt>float64</tt>, <tt>bool</tt>, and
<tt>any</tt> types, as well as the <tt>.default</tt>, <tt>.size</tt>, and <tt>.regexp</tt> control
operators, the <tt>~</tt> unwrapping operator, and the <tt>$</tt> extension point
syntax from <xref target="CDDL"/>.</t>
          <t>Additionally, this document defines the following custom types for
clarity:</t>
          <figure anchor="cddl-custom-types-def">
            <name>Additional CDDL type definitions</name>
            <sourcecode type="cddl"><![CDATA[
; CDDL's uint is defined as being 64-bit in size
; but for many protocol fields it is better to be restrictive
; and explicit
uint8 = uint .size 1
uint16 = uint .size 2
uint32 = uint .size 4
uint64 = uint .size 8

; an even-length lowercase string of hexadecimally encoded bytes
; examples: 82dc, 027339, 4cdbfd9bf0
; this is needed because the default CDDL binary string (bytes/bstr)
; is only CBOR and not JSON compatible
hexstring = text .regexp "([0-9a-f]{2})*"
]]></sourcecode>
          </figure>
          <t>All timestamps and time-related values (e.g., offsets) in qlog are
logged as <tt>float64</tt> in the millisecond resolution.</t>
          <t>Other qlog documents can define their own CDDL-compatible (struct) types
(e.g., separately for each Packet type that a protocol supports).</t>
          <ul empty="true">
            <li>
              <t>Note to RFC editor: Please remove the following text in this section before
publication.</t>
            </li>
          </ul>
          <t>The main general CDDL syntax conventions in this document a reader
should be aware of for easy reading comprehension are:</t>
          <ul spacing="normal">
            <li>
              <tt>? obj</tt> : this object is optional</li>
            <li>
              <tt>TypeName1 / TypeName2</tt> : a union of these two types (object can be either type 1 OR
type 2)</li>
            <li>
              <tt>obj: TypeName</tt> : this object has this concrete type</li>
            <li>
              <tt>obj: [* TypeName]</tt> : this object is an array of this type with
minimum size of 0 elements</li>
            <li>
              <tt>obj: [+ TypeName]</tt> : this object is an array of this type with
minimum size of 1 element</li>
            <li>
              <tt>TypeName = ...</tt> : defines a new type</li>
            <li>
              <tt>EnumName = "entry1" / "entry2" / entry3 / ...</tt>: defines an enum</li>
            <li>
              <tt>StructName = { ... }</tt> : defines a new struct type</li>
            <li>
              <tt>;</tt> : single-line comment</li>
            <li>
              <tt>* text =&gt; any</tt> : special syntax to indicate 0 or more fields that
have a string key that maps to any value. Used to indicate a generic
JSON object.</li>
          </ul>
          <t>All timestamps and time-related values (e.g., offsets) in qlog are
logged as <tt>float64</tt> in the millisecond resolution.</t>
          <t>Other qlog documents can define their own CDDL-compatible (struct) types
(e.g., separately for each Packet type that a protocol supports).</t>
        </section>
        <section anchor="serialization-examples">
          <name>Serialization examples</name>
          <t>Serialization examples in this document use JSON (<xref target="JSON"/>) unless
otherwise indicated.</t>
        </section>
      </section>
    </section>
    <section anchor="design-goals">
      <name>Design goals</name>
      <t>The main tenets for the qlog schema design are:</t>
      <ul spacing="normal">
        <li>Streamable, event-based logging</li>
        <li>A flexible format that can reduce log producer overhead, at the cost of
increased complexity for consumers (e.g. tools)</li>
        <li>Extensible and pragmatic</li>
        <li>Aggregation and transformation friendly (e.g., the top-level element
for the non-streaming format is a container for individual traces,
group_ids can be used to tag events to a particular context)</li>
        <li>Metadata is stored together with event data</li>
      </ul>
    </section>
    <section anchor="qlog-file-schema">
      <name>QlogFile schema</name>
      <t>A qlog using the QlogFile schema can contain several individual traces and logs
from multiple vantage points that are in some way related. The top-level element
in this schema defines only a small set of "header" fields and an array of
component traces, defined in <xref target="qlog-file-def"/> as:</t>
      <figure anchor="qlog-file-def">
        <name>QlogFile definition</name>
        <sourcecode type="cddl"><![CDATA[
QlogFile = {
    qlog_version: text
    ? qlog_format: text .default "JSON"
    ? title: text
    ? description: text
    ? traces: [+ Trace /
                 TraceError]
}
]]></sourcecode>
      </figure>
      <t>The required "qlog_version" field <bcp14>MUST</bcp14> have the value "0.4".</t>
      <t>The optional "qlog_format" field indicates the serialization format. Its value
<bcp14>MUST</bcp14> either be one of the options defined in this document (i.e.,
<xref target="concrete-formats"/>) or the field <bcp14>MUST</bcp14> be omitted entirely. When the field is
omitted the default value of "JSON" applies.</t>
      <t>The optional "title" and "description" fields provide additional free-text
information about the file.</t>
      <t>The optional "traces" field contains an array of qlog traces (<xref target="trace"/>), each
of which contain metadata and an array of qlog events (<xref target="events"/>).</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 <bcp14>SHOULD</bcp14> be in the first 256 characters/bytes of the resulting log file.</t>
      <t>Where a qlog file is serialized to a JSON format, one of the downsides 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. The alternative QlogFileSeq
(<xref target="qlog-file-seq-schema"/>) is better suited to streaming.</t>
      <t>JSON serialization example:</t>
      <figure anchor="qlog-file-ex">
        <name>QlogFile example</name>
        <artwork><![CDATA[
{
    "qlog_version": "0.4",
    "qlog_format": "JSON",
    "title": "Name of this particular qlog file (short)",
    "description": "Description for this group of traces (long)",
    "traces": [...]
}
]]></artwork>
      </figure>
      <section anchor="traces">
        <name>Traces</name>
        <t>It can be advantageous to group several related qlog traces together in a single
file. For example, it is possible to 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>The QlogFile "traces" field is an array that contains a list of individual qlog
traces. When capturing a qlog at a vantage point, it is expected that the traces
field contains a single entry. Files can be aggregated, for example as part of a
post-processing operation, by copying the traces in component to files into the
combined "traces" array of a new, aggregated qlog file.</t>
      </section>
      <section anchor="trace">
        <name>Trace</name>
        <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. 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>A Trace contains some metadata in addition to qlog events, defined in
<xref target="trace-def"/> as:</t>
        <figure anchor="trace-def">
          <name>Trace definition</name>
          <sourcecode type="cddl"><![CDATA[
Trace = {
    ? title: text
    ? description: text
    ? common_fields: CommonFields
    ? vantage_point: VantagePoint
    events: [* Event]
}
]]></sourcecode>
        </figure>
        <t>The optional "title" and "description" fields provide additional free-text
information about the trace.</t>
        <t>The optional "common_fields" field is described in <xref target="common-fields"/>.</t>
        <t>The optional "vantage_point" field is described in <xref target="vantage-point"/>.</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>
        <t>JSON serialization example:</t>
        <figure anchor="trace-ex">
          <name>Trace example</name>
          <artwork><![CDATA[
{
    "title": "Name of this particular trace (short)",
    "description": "Description for this trace (long)",
    "common_fields": {
        "ODCID": "abcde1234",
        "time_format": "absolute"
    },
    "vantage_point": {
        "name": "backend-67",
        "type": "server"
    },
    "events": [...]
}
]]></artwork>
        </figure>
      </section>
      <section anchor="traceerror">
        <name>TraceError</name>
        <t>A TraceError indicates that an attempt to find/convert a file for inclusion in
the aggregated qlog was made, but there was an error during the process. Rather
than silently dropping the erroneous file, it can be explicitly included in the
qlog file as an entry in the "traces" array, defined in <xref target="trace-error-def"/> as:</t>
        <figure anchor="trace-error-def">
          <name>TraceError definition</name>
          <sourcecode type="cddl"><![CDATA[
TraceError = {
    error_description: text

    ; the original URI used for attempted find of the file
    ? uri: text
    ? vantage_point: VantagePoint
}
]]></sourcecode>
        </figure>
        <t>JSON serialization example:</t>
        <figure anchor="trace-error-ex">
          <name>TraceError example</name>
          <artwork><![CDATA[
{
    "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>
    <section anchor="qlog-file-seq-schema">
      <name>QlogFileSeq schema</name>
      <t>A qlog file using the QlogFileSeq schema can be serialized to a streamable JSON
format called JSON Text Sequences (JSON-SEQ) (<xref target="RFC7464"/>). The top-level
element in this schema defines only a small set of "header" fields and an array
of component traces, defined in <xref target="qlog-file-def"/> as:</t>
      <figure anchor="qlog-file-seq-def">
        <name>QlogFileSeq definition</name>
        <sourcecode type="cddl"><![CDATA[
QlogFileSeq = {
    qlog_format: "JSON-SEQ"
    qlog_version: text
    ? title: text
    ? description: text
    trace: TraceSeq
}
]]></sourcecode>
      </figure>
      <t>The required "qlog_format" field <bcp14>MUST</bcp14> have the value "JSON-SEQ".</t>
      <t>The required "qlog_version" field <bcp14>MUST</bcp14> have the value "0.4".</t>
      <t>The optional "title" and "description" fields provide additional free-text
information about the file.</t>
      <t>The optional "trace" field contains a singular trace metadata. All qlog events
in the file are related to this trace.</t>
      <t>JSON-SEQ serialization example:</t>
      <figure anchor="json-seq-ex">
        <name>Top-level element</name>
        <artwork><![CDATA[
// list of qlog events, serialized in accordance with RFC 7464,
// starting with a Record Separator character and ending with a
// newline.
// For display purposes, Record Separators are rendered as <RS>

<RS>{
    "qlog_version": "0.4",
    "qlog_format": "JSON-SEQ",
    "title": "Name of JSON Text Sequence qlog file (short)",
    "description": "Description for this trace 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"
      }
    }
}
<RS>{"time": 2, "name": "quic:parameters_set", "data": { ... } }
<RS>{"time": 7, "name": "quic:packet_sent", "data": { ... } }
...
]]></artwork>
      </figure>
      <t>For further information about serialization, see <xref target="format-json-seq"/>.</t>
      <section anchor="traceseq">
        <name>TraceSeq</name>
        <t>TraceSeq is used with QlogFileSeq. It is conceptually similar to a Trace, with
the exception that qlog events are not contained within it, but rather appended
after it in a QlogFileSeq.</t>
        <figure anchor="trace-seq-def">
          <name>TraceSeq definition</name>
          <sourcecode type="cddl"><![CDATA[
TraceSeq = {
    ? title: text
    ? description: text
    ? common_fields: CommonFields
    ? vantage_point: VantagePoint
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="vantage-point">
      <name>VantagePoint</name>
      <t>A VantagePoint describes the vantage point from which a trace originates,
defined in <xref target="vantage-point-def"/> as:</t>
      <figure anchor="vantage-point-def">
        <name>VantagePoint definition</name>
        <sourcecode type="cddl"><![CDATA[
VantagePoint = {
    ? name: text
    type: VantagePointType
    ? flow: VantagePointType
}

; client = endpoint which initiates the connection
; server = endpoint which accepts the connection
; network = observer in between client and server
VantagePointType = "client" /
                   "server" /
                   "network" /
                   "unknown"
]]></sourcecode>
      </figure>
      <t>JSON serialization examples:</t>
      <figure anchor="vantage-point-ex">
        <name>VantagePoint example</name>
        <artwork><![CDATA[
{
    "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 anchor="events">
      <name>Events</name>
      <t>A qlog 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>An Event is defined in <xref target="event-def"/> as:</t>
      <figure anchor="event-def">
        <name>Event definition</name>
        <sourcecode type="cddl"><![CDATA[
Event = {
    time: float64
    name: text
    data: $ProtocolEventBody
    ? time_format: TimeFormat
    ? protocol_type: ProtocolType
    ? group_id: GroupID
    ? system_info: SystemInformation

    ; events can contain any amount of custom fields
    * text => any
}
]]></sourcecode>
      </figure>
      <t>Each qlog event <bcp14>MUST</bcp14> contain the mandatory fields: "time"
(<xref target="time-based-fields"/>), "name" (<xref target="name-field"/>), and "data" (<xref target="data-field"/>).</t>
      <t>Each qlog event <bcp14>MAY</bcp14> contain the optional fields: "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"/>).</t>
      <t>Multiple events can appear in a Trace or TraceSeq and they might contain fields
with identical values. It is possible to optimize out this duplication using
"common_fields" (<xref target="common-fields"/>).</t>
      <t>The specific values for each of these fields and their semantics are defined in
separate documents, depending on protocol or use case. For example: event
definitions for QUIC, HTTP/3 and QPACK can be found in <xref target="QLOG-QUIC"/> and
<xref target="QLOG-H3"/>.</t>
      <t>Events are intended to be extended with custom fields, therefore they <bcp14>MAY</bcp14>
contain other fields not defined in this document. Custom fields may be known or
unknown to tools. Tools <bcp14>SHOULD</bcp14> allow for the presence of unknown event fields,
but their semantics depend on the context of the log usage.</t>
      <t>JSON serialization:</t>
      <figure anchor="event-ex">
        <name>Event example</name>
        <artwork><![CDATA[
{
    "time": 1553986553572,

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

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

    "time_format": "absolute",

    "ODCID": "127ecc830d98f9d54a42c4f0842aa87e181a"
}
]]></artwork>
      </figure>
      <section anchor="time-based-fields">
        <name>Timestamps</name>
        <t>An event's "time" field indicates the timestamp at which the event occurred. 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 succinct 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>Definition:</t>
        <figure anchor="time-format-def">
          <name>TimeFormat definition</name>
          <sourcecode type="cddl"><![CDATA[
TimeFormat = "absolute" /
             "delta" /
             "relative"
]]></sourcecode>
        </figure>
        <ul spacing="normal">
          <li>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.</li>
          <li>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.</li>
          <li>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.</li>
        </ul>
        <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-format-ex"/>.</t>
        <figure anchor="time-format-ex">
          <name>Three different approaches for logging timestamps</name>
          <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 <bcp14>MUST</bcp14>
include a timestamp in the "time" field.</t>
        <t>Events in each individual trace <bcp14>SHOULD</bcp14> be logged in strictly ascending timestamp
order (though not necessarily absolute value, for the "delta" format). Tools <bcp14>MAY</bcp14>
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 post-processor 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 <bcp14>SHOULD NOT</bcp14> 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">
        <name>Names</name>
        <t>Events differ mainly in the type of metadata associated with them. The "name"
field is an identifier that parsers can use to decide how to interpret the event
metadata contained in the "data" field (see <xref target="data-field"/>).</t>
        <t>Event names indicate a category and type. The "name" field <bcp14>MUST</bcp14> contain a
non-empty character sequence representing a category, followed by a colon (':'),
followed by a non-empty character sequence representing a 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 "quic", "http",
"qpack", and "recovery". Within these categories, the event type provides
additional granularity. For example for QUIC and HTTP/3, within the "quic"
category, there would be "packet_sent" and "packet_received" events.</t>
        <t>JSON serialization example:</t>
        <figure anchor="name-ex">
          <name>An event with category "quic" and type "packet_sent".</name>
          <artwork><![CDATA[
{
    "name": "quic:packet_sent"
}
]]></artwork>
        </figure>
      </section>
      <section anchor="data-field">
        <name>Data</name>
        <t>An event's "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 definitions for QUIC and HTTP/3 can be found in <xref target="QLOG-QUIC"/> and
<xref target="QLOG-H3"/>.</t>
        <t>This field is defined here as a CDDL extension point (a "socket" or
"plug") named <tt>$ProtocolEventBody</tt>. Other documents <bcp14>MUST</bcp14> properly extend
this extension point when defining new data field content options to
enable automated validation of aggregated qlog schemas.</t>
        <t>The only common field defined for the data field is the <tt>trigger</tt> field,
which is discussed in <xref target="trigger-field"/>.</t>
        <t>Definition:</t>
        <figure anchor="protocoleventbody-def">
          <name>ProtocolEventBody definition</name>
          <sourcecode type="cddl"><![CDATA[
; The ProtocolEventBody is any key-value map (e.g., JSON object)
; only the optional trigger field is defined in this document
$ProtocolEventBody /= {
    ? trigger: text
    * text => any
}
; event documents are intended to extend this socket by using:
; NewProtocolEvents = EventType1 /
;                     EventType2 /
;                     ... /
;                     EventTypeN
; $ProtocolEventBody /= NewProtocolEvents
]]></sourcecode>
        </figure>
        <t>One purely illustrative example for a QUIC "packet_sent" event is shown in
<xref target="data-ex"/>:</t>
        <figure anchor="data-ex">
          <name>Example of the 'data' field for a QUIC packet_sent event</name>
          <artwork><![CDATA[
TransportPacketSent = {
    ? packet_size: uint16
    header: PacketHeader
    ? frames:[* QuicFrame]
    ? trigger: "pto_probe" /
               "retransmit_timeout" /
               "bandwidth_probe"
}

could be serialized as

{
    "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">
        <name>ProtocolType</name>
        <t>An event's "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>Definition:</t>
        <figure anchor="protocol-type-def">
          <name>ProtocolType definition</name>
          <sourcecode type="cddl"><![CDATA[
ProtocolType = [+ text]
]]></sourcecode>
        </figure>
        <t>For example, QUIC and HTTP/3 events have the "QUIC" and "HTTP3" protocol_type
entry values, see <xref target="QLOG-QUIC"/> and <xref target="QLOG-H3"/>.</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">
        <name>Triggers</name>
        <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 occurring, see
<xref target="data-field"/>. 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-ex"/>:</t>
        <figure anchor="trigger-ex">
          <name>Trigger example</name>
          <artwork><![CDATA[
TransportPacketDropped = {
    ? packet_type: PacketType
    ? raw_length: uint16
    ? trigger: "key_unavailable" /
               "unknown_connection_id" /
               "decrypt_error" /
               "unsupported_version"
}
]]></artwork>
        </figure>
      </section>
      <section anchor="group-ids">
        <name>Grouping</name>
        <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, a method for splitting up events belonging
to separate logical entities is required.</t>
        <t>The simplest way to perform this splitting is by associating a "group id"
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,
the QUIC "Original Destination Connection ID" could be used 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-ex"/>.</t>
        <t>Definition:</t>
        <figure anchor="group-id-def">
          <name>GroupID definition</name>
          <sourcecode type="cddl"><![CDATA[
GroupID = text
]]></sourcecode>
        </figure>
        <t>JSON serialization example for events grouped by four tuples
and QUIC connection IDs:</t>
        <figure anchor="group-id-ex">
          <name>GroupID example</name>
          <artwork><![CDATA[
"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": "quic:packet_received",
        "data": { ... }
    },
    {
        "time": 1553986553581,
        "protocol_type": ["QUIC","HTTP3"],
        "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",
        "name": "quic: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="systeminformation">
        <name>SystemInformation</name>
        <t>The "system_info" field can be used to record system-specific details related to an
event. This is useful, for instance, where an application splits work across
CPUs, processes, or threads and events for a single trace occur on potentially
different combinations thereof. Each field is optional to support deployment
diversity.</t>
        <t>Definition:</t>
        <sourcecode type="cddl"><![CDATA[
SystemInformation = {
  ? processor_id: uint32
  ? process_id: uint32
  ? thread_id: uint32
}
]]></sourcecode>
      </section>
      <section anchor="common-fields">
        <name>CommonFields</name>
        <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-ex"/>.</t>
        <figure anchor="common-fields-ex">
          <name>CommonFields example</name>
          <artwork><![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": "quic: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 instead
extracted to common_fields:

{
    "common_fields": {
        "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",
        "protocol_type": ["QUIC","HTTP3"],
        "time_format": "relative",
        "reference_time": 1553986553572
    },
    "events": [
        {
            "time": 2,
            "name": "quic:packet_received",
            "data": { ... }
        },{
            "time": 7,
            "name": "http:frame_parsed",
            "data": { ... }
        }
    ]
}
]]></artwork>
        </figure>
        <t>An event's "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 <bcp14>MUST</bcp14> be disregarded
by the user and tools (i.e., the presence of an unknown 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 shown in the listing
below:</t>
        <t>Definition:</t>
        <figure anchor="common-fields-def">
          <name>CommonFields definition</name>
          <sourcecode type="cddl"><![CDATA[
CommonFields = {
    ? time_format: TimeFormat
    ? reference_time: float64
    ? protocol_type: ProtocolType
    ? group_id: GroupID
    * text => any
}
]]></sourcecode>
        </figure>
        <t>Tools <bcp14>MUST</bcp14> 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 <bcp14>MUST NOT</bcp14> 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 anchor="raw-info">
      <name>Raw packet and frame information</name>
      <t>While qlog is a high-level logging format, it also allows the inclusion of most
raw wire image information, such as byte lengths and byte values. This is useful
when for example investigating or tuning packetization behavior or determining
encoding/framing overheads. However, these fields are not always necessary, can
take up considerable space, and can have a considerable privacy and security
impact (see <xref target="privacy"/>). Where applicable, these fields are grouped in a
separate, optional, field named "raw" of type RawInfo. The exact definition of
entities, headers, trailers and payloads depend on the protocol used.</t>
      <t>Definition:</t>
      <figure anchor="raw-info-def">
        <name>RawInfo definition</name>
        <sourcecode type="cddl"><![CDATA[
RawInfo = {

    ; the full byte length of the entity (e.g., packet or frame),
    ; including possible headers and trailers
    ? length: uint64

    ; the byte length of the entity's payload,
    ; excluding possible headers or trailers
    ? payload_length: uint64

    ; the (potentially truncated) contents of the full entity,
    ; including headers and possibly trailers
    ? data: hexstring
}
]]></sourcecode>
      </figure>
      <t>The RawInfo:data field can be truncated for privacy or security purposes, see
<xref target="truncated-values"/>. In this case, the length and payload_length fields should
still indicate the non-truncated lengths when used for debugging purposes.</t>
      <t>This document does not specify explicit header_length or trailer_length fields.
In protocols without trailers, header_length can be calculated by subtracting
the payload_length from the length. In protocols with trailers (e.g., QUIC's
AEAD tag), event definition documents <bcp14>SHOULD</bcp14> define how to support header_length
calculation.</t>
    </section>
    <section anchor="common-events-and-data-classes">
      <name>Common events and data classes</name>
      <t>There are some event types and data classes that are common across protocols,
applications, and use cases. This section specifies such common definitions.</t>
      <section anchor="generic-events">
        <name>Generic events</name>
        <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">
          <name>error</name>
          <t>Importance: Core</t>
          <t>Used to log details of an internal error that might not get reflected on the wire.</t>
          <t>Definition:</t>
          <figure anchor="generic-error-def">
            <name>GenericError definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericError = {
    ? code: uint64
    ? message: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="warning">
          <name>warning</name>
          <t>Importance: Base</t>
          <t>Used to log details of an internal warning that might not get reflected on the
wire.</t>
          <t>Definition:</t>
          <figure anchor="generic-warning-def">
            <name>GenericWarning definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericWarning = {
    ? code: uint64
    ? message: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="info">
          <name>info</name>
          <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>Definition:</t>
          <figure anchor="generic-info-def">
            <name>GenericInfo definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericInfo = {
    message: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="debug">
          <name>debug</name>
          <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>Definition:</t>
          <figure anchor="generic-debug-def">
            <name>GenericDebug definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericDebug = {
    message: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="verbose">
          <name>verbose</name>
          <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>Definition:</t>
          <figure anchor="generic-verbose-def">
            <name>GenericVerbose definition</name>
            <sourcecode type="cddl"><![CDATA[
GenericVerbose = {
    message: text
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="simulation-events">
        <name>Simulation events</name>
        <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">
          <name>scenario</name>
          <t>Importance: Extra</t>
          <t>Used to specify which specific scenario is being tested at this particular
instance. This supports, for example, aggregation of
several simulations into one trace (e.g., split by <tt>group_id</tt>).</t>
          <t>Definition:</t>
          <figure anchor="simulation-scenario-def">
            <name>SimulationScenario definition</name>
            <sourcecode type="cddl"><![CDATA[
SimulationScenario = {
    ? name: text
    ? details: {* text => any }
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="marker">
          <name>marker</name>
          <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>
          <t>Definition:</t>
          <figure anchor="simulation-marker-def">
            <name>SimulationMarker definition</name>
            <sourcecode type="cddl"><![CDATA[
SimulationMarker = {
    ? type: text
    ? message: text
}
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="event-definition-guidelines">
      <name>Event definition guidelines</name>
      <t>This document defines the main schema for the qlog format together with some
common events, which on their own do not provide much logging utility. It is
expected that logging is extended with specific, per-protocol event definitions
that specify the name (category + type) and data needed for each individual
event. Examples include the QUIC event definitions <xref target="QLOG-QUIC"/> and HTTP/3 and
QPACK event definitions <xref target="QLOG-H3"/>.</t>
      <t>This section defines some basic annotations and concepts that <bcp14>SHOULD</bcp14> be used by
event definition documents. Doing so ensures a measure of consistency that makes
it easier for qlog implementers to support a wide variety of protocols.</t>
      <section anchor="event-design">
        <name>Event design</name>
        <t>There are several ways of defining qlog events. In practice, two main types of
approach have been observed: a) those that map directly to concepts seen in the
protocols (e.g., <tt>packet_sent</tt>) and b) those that act as aggregating events that
combine data from several possible protocol behaviors or code paths into one
(e.g., <tt>parameters_set</tt>). 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 <tt>spin_bit_updated</tt> or
<tt>connection_id_updated</tt> for QUIC).</t>
        <t>Finally, when logging additional state change events, those state changes can
often be directly inferred from data on the wire (for example flow control limit
changes). As such, if the implementation is bug-free and spec-compliant, logging
additional events is typically avoided. Exceptions have been made for common
events that benefit from being easily identifiable or individually logged (for
example <tt>packets_acked</tt>).</t>
      </section>
      <section anchor="event-importance-indicators">
        <name>Event importance indicators</name>
        <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
<tt>connection_started</tt> event overlaps with the more generic
<tt>connection_state_updated</tt>. 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, each event <bcp14>SHOULD</bcp14> have an "importance indicator"
with one of three values, in decreasing order of importance and expected usage:</t>
        <ul spacing="normal">
          <li>Core</li>
          <li>Base</li>
          <li>Extra</li>
        </ul>
        <t>The "Core" events are the events that <bcp14>SHOULD</bcp14> 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 <bcp14>SHOULD</bcp14>
expect and add support for these events, though <bcp14>SHOULD NOT</bcp14> expect all Core events
to be present in each qlog trace.</t>
        <t>The "Base" events add additional debugging options and <bcp14>MAY</bcp14> 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 used to help show when decisions are actually made
based on received data. Tool implementers <bcp14>SHOULD</bcp14> 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 behavior. As such, they <bcp14>MAY</bcp14> be present in qlog files and tool
implementers <bcp14>MAY</bcp14> 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 <bcp14>SHOULD</bcp14> use (a subset of) relevant "Base" events instead to
ensure usability of the qlog output. As an example, implementations that do not
log QUIC <tt>packet_received</tt> events and thus also not which (if any) ACK frames the
packet contains, <bcp14>SHOULD</bcp14> log <tt>packets_acked</tt> 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">
        <name>Custom fields\</name>
        <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 <bcp14>SHOULD NOT</bcp14> expect non-specialized tools to recognize or visualize
this custom data. However, tools <bcp14>SHOULD</bcp14> make an effort to visualize even unknown
data if possible in the specific tool's context. If they do not, they <bcp14>MUST</bcp14> ignore
these unknown fields.</t>
      </section>
    </section>
    <section anchor="concrete-formats">
      <name>Serializing qlog</name>
      <t>This document and other related qlog schema definitions are intentionally
independent of serialization format. 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, protobuf,
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 how to practically transform qlog
schema definitions to <xref target="JSON"/>, its subset <xref target="I-JSON"/>,
and its streamable derivative <xref target="JSON-Text-Sequences"/>s. Concrete options
to bring down JSON size and processing overheads are discuseed 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">
        <name>qlog to JSON mapping</name>
        <t>When mapping qlog to normal JSON, the "qlog_format" field <bcp14>MUST</bcp14> have the value
"JSON". This is also the default qlog serialization and default value of this
field.</t>
        <t>When using normal JSON serialization, the file extension/suffix <bcp14>SHOULD</bcp14>
be ".qlog" and the Media Type (if any) <bcp14>SHOULD</bcp14> be "application/qlog+json"
per <xref target="RFC6839"/>.</t>
        <t>JSON files by definition (<xref target="RFC8259"/>) <bcp14>MUST</bcp14> utilize the UTF-8 encoding,
both for the file itself and the string values.</t>
        <t>While not specifically required by the JSON specification, all qlog field
names in a JSON serialization <bcp14>MUST</bcp14> be lowercase.</t>
        <t>In order to serialize CDDL-based qlog event and data structure
definitions to JSON, the official CDDL-to-JSON mapping defined in
Appendix E of <xref target="CDDL"/> <bcp14>SHOULD</bcp14> be employed.</t>
        <section anchor="i-json">
          <name>I-JSON</name>
          <t>For some use cases, it should be taken into account that not all popular
JSON parsers support the full JSON format. Especially for parsers
integrated with the JavaScript programming language (e.g., Web browsers,
NodeJS), users are recommended to stick to a JSON subset dubbed
<xref target="I-JSON"/> (or Internet-JSON).</t>
          <t>One of the key limitations of JavaScript and thus I-JSON is that it
cannot represent full 64-bit integers in standard operating mode (i.e.,
without using BigInt extensions), instead being limited to the range of
<tt>[-(2**53)+1, (2**53)-1]</tt>. In these circumstances, Appendix E of
<xref target="CDDL"/> recommends defining new CDDL types for int64 and
uint64 that limit their values to this range.</t>
          <t>While this can be sensible and workable for most use cases, some
protocols targeting qlog serialization (e.g., QUIC, HTTP/3), might
require full uint64 variables in some (rare) circumstances. In these
situations, it should be allowed to also use the string-based
representation of uint64 values alongside the numerical representation.
Concretely, the following definition of uint64 should override the
original and (web-based) tools should take into account that a uint64
field can be either a number or string.</t>
          <figure anchor="cddl-ijson-uint64-def">
            <name>Custom uint64 definition for I-JSON</name>
            <artwork><![CDATA[
uint64 = text /
         uint .size 8
]]></artwork>
          </figure>
        </section>
        <section anchor="truncated-values">
          <name>Truncated values</name>
          <t>For some use cases (e.g., limiting file size, privacy), it can be
necessary not to log a full raw blob (using the <tt>hexstring</tt> type) 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.</t>
          <t>As such, all qlog schema definitions <bcp14>SHOULD</bcp14> include a separate,
length-indicating field for all fields of type <tt>hexstring</tt> they specify,
see for example <xref target="raw-info"/>. This not only ensures the original length
can always be retrieved, 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 <bcp14>MUST</bcp14>
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.
The main possible permutations are shown by example in
<xref target="truncated-values-ex"/>.</t>
          <figure anchor="truncated-values-ex">
            <name>Example for serializing truncated hexstrings</name>
            <artwork><![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="format-json-seq">
        <name>qlog to JSON Text Sequences mapping</name>
        <t>JSON Text Sequences are very similar to JSON, except that JSON objects are
serialized as individual records, each prefixed by an ASCII Record Separator
(&lt;RS&gt;, 0x1E), and each ending with an ASCII Line Feed character (\n, 0x0A). Note
that each record can also contain any amount of newlines in its body, as long as
it ends with a newline character before the next &lt;RS&gt; character.</t>
        <t>Each qlog event is serialized and interpreted as an individual JSON Text Sequence
record, and can simply be appended as a new object at the back of an event stream
or log file. Put differently, unlike default JSON, it does not require a file to
be wrapped as a full object with "{ ... }" or "[... ]".</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 "header", as
indicated by the TraceSeq object in <xref target="trace-seq-def"/>. Additionally,
qlog's JSON-SEQ mapping does not allow logging multiple individual
traces in a single qlog file. As such, the QlogFile:traces field is
replaced by the singular QlogFileSeq:trace field, see
<xref target="qlog-file-seq-def"/>. An example can be seen in <xref target="json-seq-ex"/>. 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 JSON-SEQ
qlog file.</t>
        <t>When using JSON-SEQ serialization, the file extension/suffix <bcp14>SHOULD</bcp14> be
".sqlog" (for "streaming" qlog) and the Media Type (if any) <bcp14>SHOULD</bcp14> be
"application/qlog+json-seq" per <xref target="RFC8091"/>.</t>
        <t>While not specifically required by the JSON-SEQ specification, all qlog
field names in a JSON-SEQ serialization <bcp14>MUST</bcp14> be lowercase.</t>
        <t>In order to serialize all other CDDL-based qlog event and data structure
definitions to JSON-SEQ, the official CDDL-to-JSON mapping defined in
Appendix E of <xref target="CDDL"/> <bcp14>SHOULD</bcp14> still be employed.</t>
        <section anchor="supporting-json-text-sequences-in-tooling">
          <name>Supporting JSON Text Sequences in tooling</name>
          <t>Note that JSON Text Sequences are not supported in most default programming
environments (unlike normal JSON). However, several custom JSON-SEQ parsing
libraries exist in most programming languages that can be used and the format is
easy enough to parse with existing implementations (i.e., by splitting the file
into its component records and feeding them to a normal JSON parser individually,
as each record by itself is a valid JSON object).</t>
        </section>
      </section>
      <section anchor="optimizations">
        <name>Other optimized formatting options</name>
        <t>Both the JSON and JSON-SEQ 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
JSON(-SEQ) (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, a multitude of alternative formatting
and optimization options were compared. 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 <bcp14>SHOULD</bcp14> 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. It was
decided 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"/>), it is recommended that explicit file extensions are used to indicate specific
formats. As there are no standards in place for this type of extension to format
mapping, a commonly used scheme is proposed: 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 ".(s)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">
          <name>Data structure optimizations</name>
          <t>The first general category of optimizations is to alter the representation of data
within an JSON(-SEQ) 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
"JSON-SEQ.namedheaders") for the "qlog_format" field (see <xref target="qlog-file-schema"/>).</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 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
"JSON-SEQ.dictionary") for the "qlog_format" field (see <xref target="qlog-file-schema"/>).</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">
          <name>Compression</name>
          <t>The second general category of optimizations is to utilize a (generic) compression
scheme for textual data. As qlog in the JSON(-SEQ) 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 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 .(s)qlog.gz <bcp14>SHOULD</bcp14> BE
used. The "qlog_format" field should still reflect the original JSON formatting of
the qlog data (e.g., "JSON" or "JSON-SEQ").</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 .(s)qlog.br <bcp14>SHOULD</bcp14> BE used. The
"qlog_format" field should still reflect the original JSON formatting of the qlog
data (e.g., "JSON" or "JSON-SEQ").</t>
          <t>Other compression algorithms of course exist (for example xz, zstd, and lz4). The
gzip and brotli are recommended because of their tweakable behaviour and wide
support in web-based environments, which is envisioned as the main tooling ecosystem
(see also <xref target="tooling"/>).</t>
        </section>
        <section anchor="binary">
          <name>Binary formats</name>
          <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 the purposes of qlog, CBOR can be viewed as a straightforward
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 JSON-SEQ qlogs
to convert them to CBOR-SEQ, see <xref target="RFC8742"/>). While CBOR thus does retain the
full qlog flexibility, it only provides a 25% file size reduction (100MB to 75MB)
compared to textual JSON(-SEQ). 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
.(s)qlog.cbor <bcp14>SHOULD</bcp14> BE used. The "qlog_format" field should still reflect the
original JSON formatting of the qlog data (e.g., "JSON" or "JSON-SEQ"). The media
type should indicate both whether JSON or JSON Text Sequences are used, as well as
whether CBOR or CBOR Sequences are used (see the table below).</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. A 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
.(s)qlog.protobuf <bcp14>SHOULD</bcp14> 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, the more flexible
compressed textual JSON options are likely a better default for the qlog format in
general.</t>
          <t/>
        </section>
        <section anchor="format-summary">
          <name>Overview and summary</name>
          <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>
          <table>
            <thead>
              <tr>
                <th align="left">format</th>
                <th align="left">qlog_format</th>
                <th align="left">extension</th>
                <th align="left">media type</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">JSON <xref target="format-json"/></td>
                <td align="left">JSON</td>
                <td align="left">.qlog</td>
                <td align="left">application/qlog+json</td>
              </tr>
              <tr>
                <td align="left">JSON Text Sequences  <xref target="format-json-seq"/></td>
                <td align="left">JSON-SEQ</td>
                <td align="left">.sqlog</td>
                <td align="left">application/qlog+json-seq</td>
              </tr>
              <tr>
                <td align="left">named headers <xref target="structure-optimizations"/></td>
                <td align="left">JSON(-SEQ).namedheaders</td>
                <td align="left">.(s)qlog</td>
                <td align="left">application/qlog+json(-seq)</td>
              </tr>
              <tr>
                <td align="left">dictionary <xref target="structure-optimizations"/></td>
                <td align="left">JSON(-SEQ).dictionary</td>
                <td align="left">.(s)qlog</td>
                <td align="left">application/qlog+json(-seq)</td>
              </tr>
              <tr>
                <td align="left">CBOR <xref target="binary"/></td>
                <td align="left">JSON(-SEQ)</td>
                <td align="left">.(s)qlog.cbor</td>
                <td align="left">application/qlog+json(-seq)+cbor(-seq)</td>
              </tr>
              <tr>
                <td align="left">protobuf <xref target="binary"/></td>
                <td align="left">protobuf</td>
                <td align="left">.qlog.protobuf</td>
                <td align="left">NOT SPECIFIED BY IANA</td>
              </tr>
              <tr>
                <td align="left"> </td>
                <td align="left"> </td>
                <td align="left"> </td>
                <td align="left"> </td>
              </tr>
              <tr>
                <td align="left">gzip <xref target="compression"/></td>
                <td align="left">no change</td>
                <td align="left">.gz suffix</td>
                <td align="left">application/gzip</td>
              </tr>
              <tr>
                <td align="left">brotli <xref target="compression"/></td>
                <td align="left">no change</td>
                <td align="left">.br suffix</td>
                <td align="left">NOT SPECIFIED BY IANA</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="conversion">
        <name>Conversion between formats</name>
        <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 JSON-SEQ
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, other structured logging approaches 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">
      <name>Methods of access and generation</name>
      <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">
        <name>Set file output destination via an environment variable</name>
        <t>To provide users control over where and how qlog files are created, two
environment variables are defined. The first, QLOGFILE, indicates a full path to where an
individual qlog file should be stored. This path <bcp14>MUST</bcp14> include the full file
extension. The second, QLOGDIR, sets a general directory path in which qlog files
should be placed. This path <bcp14>MUST</bcp14> 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 <bcp14>SHOULD</bcp14> provide support for QLOGDIR and <bcp14>MAY</bcp14> 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 anchor="qlogdir-example">
          <name>Environment variable examples for a QUIC implementation</name>
          <artwork><![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>
    <section anchor="tooling">
      <name>Tooling requirements</name>
      <t>Tools ingestion qlog <bcp14>MUST</bcp14> indicate which qlog version(s), qlog format(s),
compression methods and potentially other input file formats (for example .pcap)
they support. Tools <bcp14>SHOULD</bcp14> at least support .qlog files in the default JSON format
(<xref target="format-json"/>). Additionally, they <bcp14>SHOULD</bcp14> indicate exactly which values for and
properties of the name (category and type) and data fields they look for to
execute their logic. Tools <bcp14>SHOULD</bcp14> 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
<bcp14>SHOULD</bcp14> generate a clear error message to this effect.</t>
      <t>Tools <bcp14>MUST NOT</bcp14> produce breaking errors for any field names and/or values in the
qlog format that they do not recognize. Tools <bcp14>SHOULD</bcp14> indicate even unknown event
occurrences 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">
      <name>Security and privacy considerations</name>
      <t>Protocols such as TLS <xref target="RFC8446"/> and QUIC <xref target="RFC9000"/> provide varying degrees
of secure protection for the wire image <xref target="RFC8546"/>. There is inevitably
tension between security and observability, when logging can reveal aspects of
the wire image, that would ordinarily be protected. This tension equally applies
to any privacy considerations that build on security properties, especially if
data can be correlated across data sources.</t>
      <t>qlog operators and implementers should be mindful of the security and privacy
risks inherent in handling qlog data. This includes but is not limited to
logging, storing, or using the data. Data might be considered as non-sensitive,
potentially-sensitive, or sensitive; applying the considerations in this section
may produce different risks depending on the nature of the data itself, or its
handling. However, in many cases the largest risk factors arise from data that
can be considered as potenially-sensitive or sensitive.</t>
      <t>The following is a non-exhaustive list of such fields and types of data that can
be carried in qlog data:</t>
      <ul spacing="normal">
        <li>IP addresses and transport protocol port numbers, which can be used to
uniquely identify individual connections, endpoints, and potentially users.</li>
        <li>Session, Connection, or User identifiers which can be used to correlate
nominally separate contexts. For example, QUIC Connection IDs can be used to
identify and track users across geographical networks <xref section="9.5" sectionFormat="of" target="RFC9000"/>).</li>
        <li>System-level information such as CPU, process, or thread identifiers.</li>
        <li>Stored State which can be used to correlate individual connections or sessions
over time. Examples include QUIC address validation and retry tokens, TLS
session tickets, and HTTP cookies.</li>
        <li>Decryption keys, passwords, and tokens which can be used with other data
sources (e.g., captures of encrypted packets) to correlate qlog data to a
specific connection or user or leak additional information. Examples include
TLS decryption keys and HTTP-level API access or authorization tokens.</li>
        <li>Data that can be used to correlate qlogs to other data sources (e.g., captures
of encrypted packets). Examples include high-resolution event timestamps or
inter-event timings, event counts, packet and frame sizes.</li>
        <li>Full or partial encrypted raw packet and frame payloads, which can be used
with other data sources (e.g., captures of encrypted packets) to correlate
qlog data to a specific connection or session.</li>
        <li>Full or partial plaintext raw packet and frame payloads (e.g., HTTP Field
values, HTTP response data, TLS SNI field values), which can contain directly
sensitive information.</li>
      </ul>
      <t>The simplest and most extreme form of protection against abuse of this
information is the complete deletion of a given field, which is equivalent to
not logging the field(s) in question. While deletion completely protects the
data in the deleted fields from the risk of compromise, it also reduces the
utility of the dataset as a whole. As such, a balance should be found between
logging these fields and the potential risks inherent in their (involuntary)
disclosure. This balance depends on the use case at hand (e.g., research
datasets might have different requirements to live operational troubleshooting).
Capturing the minimal amount of data required for a specific purpose can help to
minimize the risks associated with data usage. qlog implementations that provide
fine-grained control over the inclusion of data fields, ideally on a
per-use-case or per-connection basis, improve the ability to minimize data.</t>
      <t>Any data that is determined to be necessary for a use case at hand could be
logged or captured. As per <xref target="RFC6973"/>, operators must be aware that such data
will be at risk of compromise. As such, measures should be taken to firstly
reduce the risk of compromise and secondly reduce the risk of abuse of
compromised data. While a full discussion of both aspects is out of scope for
this document, the following paragraphs discuss high-level considerations that
can be applied to qlog data.</t>
      <t>To reduce the risk of compromise, operators can take measures such as: limiting
the length of time that data is stored, encrypting data in transit and at rest,
limiting access rights to the data, and auditing data usage practices. qlog
deployments that provide integrated options for automated or manual data
deletion and (aggressive) aggregation, improve the ability to minimize the risk
of compromise.</t>
      <t>To reduce the risk of data abuse after compromise, data can be anonymized,
pseudonymized, otherwise permutated/replaced, truncated, (re-)encrypted, or
aggregated. A partial discussion of applicable techniques (especially for IP
address information) can be found in <xref section="B" sectionFormat="of" target="DNS-PRIVACY"/>.
Operators should, however, be aware that many of these techniques have been
shown to be insufficient to safeguard user privacy and/or to protect user
identity, especially if a qlog data set is large or easily correlated against
other data sources.</t>
      <t>Finally, qlog operators should consider the interplay between their use case
needs and end user rights or preferences. While active user participation (as
indicated by <xref target="RFC6973"/>) on a per-qlog basis is difficult, as logs are often
captured out-of-band to the main user interaction and intent, general user
expectations should be taken into account. qlog deployments that provide
mechanisms to integrate the capture, storage and removal of qlogs with more
general, often pre-existing, user preference and privacy control systems,
improve the ability to protect data sensitive or confidential to the end user.
In qlog, these data are typically (but not exclusively) contained in fields of
the RawInfo type (see <xref target="raw-info"/>). qlog users should thus be particularly
hesitant to include these fields for all but the most stringent use cases.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>There are no IANA considerations.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="JSON">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <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="I-JSON">
          <front>
            <title>The I-JSON Message Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>I-JSON (short for "Internet JSON") is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7493"/>
          <seriesInfo name="DOI" value="10.17487/RFC7493"/>
        </reference>
        <reference anchor="JSON-Text-Sequences">
          <front>
            <title>JavaScript Object Notation (JSON) Text Sequences</title>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="February" year="2015"/>
            <abstract>
              <t>This document describes the JavaScript Object Notation (JSON) text sequence format and associated media type "application/json-seq". A JSON text sequence consists of any number of JSON texts, all encoded in UTF-8, each prefixed by an ASCII Record Separator (0x1E), and each ending with an ASCII Line Feed character (0x0A).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7464"/>
          <seriesInfo name="DOI" value="10.17487/RFC7464"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <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="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="CDDL">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC7464">
          <front>
            <title>JavaScript Object Notation (JSON) Text Sequences</title>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="February" year="2015"/>
            <abstract>
              <t>This document describes the JavaScript Object Notation (JSON) text sequence format and associated media type "application/json-seq". A JSON text sequence consists of any number of JSON texts, all encoded in UTF-8, each prefixed by an ASCII Record Separator (0x1E), and each ending with an ASCII Line Feed character (0x0A).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7464"/>
          <seriesInfo name="DOI" value="10.17487/RFC7464"/>
        </reference>
        <reference anchor="RFC6839">
          <front>
            <title>Additional Media Type Structured Syntax Suffixes</title>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>A content media type name sometimes includes partitioned meta- information distinguished by a structured syntax to permit noting an attribute of the media as a suffix to the name. This document defines several structured syntax suffixes for use with media type registrations. In particular, it defines and registers the "+json", "+ber", "+der", "+fastinfoset", "+wbxml" and "+zip" structured syntax suffixes, and provides a media type structured syntax suffix registration form for the "+xml" structured syntax suffix. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6839"/>
          <seriesInfo name="DOI" value="10.17487/RFC6839"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <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="RFC8091">
          <front>
            <title>A Media Type Structured Syntax Suffix for JSON Text Sequences</title>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <date month="February" year="2017"/>
            <abstract>
              <t>Structured syntax suffixes for media types allow other media types to build on them and make it explicit that they are built on an existing media type as their foundation. This specification defines and registers "+json-seq" as a structured syntax suffix for JSON text sequences.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8091"/>
          <seriesInfo name="DOI" value="10.17487/RFC8091"/>
        </reference>
        <reference anchor="RFC4180">
          <front>
            <title>Common Format and MIME Type for Comma-Separated Values (CSV) Files</title>
            <author fullname="Y. Shafranovich" initials="Y." surname="Shafranovich"/>
            <date month="October" year="2005"/>
            <abstract>
              <t>This RFC documents the format used for Comma-Separated Values (CSV) files and registers the associated MIME type "text/csv". 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">
          <front>
            <title>GZIP file format specification version 4.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <date month="May" year="1996"/>
            <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">
          <front>
            <title>Brotli Compressed Data Format</title>
            <author fullname="J. Alakuijala" initials="J." surname="Alakuijala"/>
            <author fullname="Z. Szabadka" initials="Z." surname="Szabadka"/>
            <date month="July" year="2016"/>
            <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">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="October" year="2013"/>
            <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>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC6973">
          <front>
            <title>Privacy Considerations for Internet Protocols</title>
            <author fullname="A. Cooper" initials="A." surname="Cooper"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="J. Peterson" initials="J." surname="Peterson"/>
            <author fullname="J. Morris" initials="J." surname="Morris"/>
            <author fullname="M. Hansen" initials="M." surname="Hansen"/>
            <author fullname="R. Smith" initials="R." surname="Smith"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document offers guidance for developing privacy considerations for inclusion in protocol specifications. It aims to make designers, implementers, and users of Internet protocols aware of privacy-related design choices. It suggests that whether any individual RFC warrants a specific privacy considerations section will depend on the document's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6973"/>
          <seriesInfo name="DOI" value="10.17487/RFC6973"/>
        </reference>
        <reference anchor="DNS-PRIVACY">
          <front>
            <title>Recommendations for DNS Privacy Service Operators</title>
            <author fullname="S. Dickinson" initials="S." surname="Dickinson"/>
            <author fullname="B. Overeinder" initials="B." surname="Overeinder"/>
            <author fullname="R. van Rijswijk-Deij" initials="R." surname="van Rijswijk-Deij"/>
            <author fullname="A. Mankin" initials="A." surname="Mankin"/>
            <date month="October" year="2020"/>
            <abstract>
              <t>This document presents operational, policy, and security considerations for DNS recursive resolver operators who choose to offer DNS privacy services. With these recommendations, the operator can make deliberate decisions regarding which services to provide, as well as understanding how those decisions and the alternatives impact the privacy of users.</t>
              <t>This document also presents a non-normative framework to assist writers of a Recursive operator Privacy Statement, analogous to DNS Security Extensions (DNSSEC) Policies and DNSSEC Practice Statements described in RFC 6841.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="232"/>
          <seriesInfo name="RFC" value="8932"/>
          <seriesInfo name="DOI" value="10.17487/RFC8932"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="QLOG-QUIC">
          <front>
            <title>QUIC event definitions for qlog</title>
            <author fullname="Robin Marx" initials="R." surname="Marx">
              <organization>Akamai</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Meta</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
              <organization>Protocol Labs</organization>
            </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="10" month="July" year="2023"/>
            <abstract>
              <t>   This document describes concrete qlog event definitions and their
   metadata for QUIC events.  These events can then be embedded in the
   higher level schema defined in [QLOG-MAIN].

Note to Readers

      Note to RFC editor: Please remove this section before publication.

   Feedback and discussion are welcome at https://github.com/quicwg/qlog
   (https://github.com/quicwg/qlog).  Readers are advised to refer to
   the "editor's draft" at that URL for an up-to-date version of this
   document.

   Concrete examples of integrations of this schema in various
   programming languages can be found at https://github.com/quiclog/
   qlog/ (https://github.com/quiclog/qlog/).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-05"/>
        </reference>
        <reference anchor="QLOG-H3">
          <front>
            <title>HTTP/3 and QPACK qlog event definitions</title>
            <author fullname="Robin Marx" initials="R." surname="Marx">
              <organization>Akamai</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Meta</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
              <organization>Protocol Labs</organization>
            </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="10" month="July" year="2023"/>
            <abstract>
              <t>   This document describes concrete qlog event definitions and their
   metadata for HTTP/3 and QPACK-related events.  These events can then
   be embedded in the higher level schema defined in [QLOG-MAIN].

Note to Readers

      Note to RFC editor: Please remove this section before publication.

   Feedback and discussion are welcome at https://github.com/quicwg/qlog
   (https://github.com/quicwg/qlog).  Readers are advised to refer to
   the "editor's draft" at that URL for an up-to-date version of this
   document.

   Concrete examples of integrations of this schema in various
   programming languages can be found at https://github.com/quiclog/
   qlog/ (https://github.com/quiclog/qlog/).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-h3-events-05"/>
        </reference>
        <reference anchor="RFC8742">
          <front>
            <title>Concise Binary Object Representation (CBOR) Sequences</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document describes the Concise Binary Object Representation (CBOR) Sequence format and associated media type "application/cbor-seq". A CBOR Sequence consists of any number of encoded CBOR data items, simply concatenated in sequence.</t>
              <t>Structured syntax suffixes for media types allow other media types to build on them and make it explicit that they are built on an existing media type as their foundation. This specification defines and registers "+cbor-seq" as a structured syntax suffix for CBOR Sequences.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8742"/>
          <seriesInfo name="DOI" value="10.17487/RFC8742"/>
        </reference>
        <reference anchor="RFC8546">
          <front>
            <title>The Wire Image of a Network Protocol</title>
            <author fullname="B. Trammell" initials="B." surname="Trammell"/>
            <author fullname="M. Kuehlewind" initials="M." surname="Kuehlewind"/>
            <date month="April" year="2019"/>
            <abstract>
              <t>This document defines the wire image, an abstraction of the information available to an on-path non-participant in a networking protocol. This abstraction is intended to shed light on the implications that increased encryption has for network functions that use the wire image.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8546"/>
          <seriesInfo name="DOI" value="10.17487/RFC8546"/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Much of the initial work by Robin Marx was done at the Hasselt and KU Leuven
Universities.</t>
      <t>Thanks to Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen Petrides, Jari
Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind, and Jeremy Laine for
their feedback and suggestions.</t>
    </section>
    <section numbered="false" removeInRFC="true" anchor="change-log">
      <name>Change Log</name>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-06">
        <name>Since draft-ietf-quic-qlog-main-schema-06:</name>
        <ul spacing="normal">
          <li>Editorial reworking of the document (#331, #332)</li>
          <li>Updated IANA considerations section (#333)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-05">
        <name>Since draft-ietf-quic-qlog-main-schema-05:</name>
        <ul spacing="normal">
          <li>Updated qlog_version to 0.4 (due to breaking changes) (#314)</li>
          <li>Renamed 'transport' category to 'quic' (#302)</li>
          <li>Added 'system_info' field (#305)</li>
          <li>Removed 'summary' and 'configuration' fields (#308)</li>
          <li>Editorial and formatting changes (#298, #303, #304, #316, #320, #321, #322, #326, #328)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-04">
        <name>Since draft-ietf-quic-qlog-main-schema-04:</name>
        <ul spacing="normal">
          <li>Updated RawInfo definition and guidance (#243)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-03">
        <name>Since draft-ietf-quic-qlog-main-schema-03:</name>
        <ul spacing="normal">
          <li>Added security and privacy considerations discussion (#252)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-02">
        <name>Since draft-ietf-quic-qlog-main-schema-02:</name>
        <ul spacing="normal">
          <li>No changes - new draft to prevent expiration</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-01">
        <name>Since draft-ietf-quic-qlog-main-schema-01:</name>
        <ul spacing="normal">
          <li>Change the data definition language from TypeScript to CDDL (#143)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-00">
        <name>Since draft-ietf-quic-qlog-main-schema-00:</name>
        <ul spacing="normal">
          <li>Changed the streaming serialization format from NDJSON to JSON Text Sequences
(#172)</li>
          <li>Added Media Type definitions for various qlog formats (#158)</li>
          <li>Changed to semantic versioning</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-marx-qlog-main-schema-draft-02">
        <name>Since draft-marx-qlog-main-schema-draft-02:</name>
        <ul spacing="normal">
          <li>These changes were done in preparation of the adoption of the drafts by the QUIC
working group (#137)</li>
          <li>Moved RawInfo, Importance, Generic events and Simulation events to this document.</li>
          <li>Added basic event definition guidelines</li>
          <li>Made protocol_type an array instead of a string (#146)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-marx-qlog-main-schema-01">
        <name>Since draft-marx-qlog-main-schema-01:</name>
        <ul spacing="normal">
          <li>
            <t>Decoupled qlog from the JSON format and described a mapping instead (#89)
            </t>
            <ul spacing="normal">
              <li>Data types are now specified in this document and proper definitions for
fields were added in this format</li>
              <li>64-bit numbers can now be either strings or numbers, with a preference for
numbers (#10)</li>
              <li>binary blobs are now logged as lowercase hex strings (#39, #36)</li>
              <li>added guidance to add length-specifiers for binary blobs (#102)</li>
            </ul>
          </li>
          <li>Removed "time_units" from Configuration. All times are now in ms instead (#95)</li>
          <li>Removed the "event_fields" setup for a more straightforward JSON format
(#101,#89)</li>
          <li>Added a streaming option using the NDJSON format (#109,#2,#106)</li>
          <li>Described optional optimization options for implementers (#30)</li>
          <li>Added QLOGDIR and QLOGFILE environment variables, clarified the .well-known URL
usage (#26,#33,#51)</li>
          <li>Overall tightened up the text and added more examples</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-marx-qlog-main-schema-00">
        <name>Since draft-marx-qlog-main-schema-00:</name>
        <ul spacing="normal">
          <li>All field names are now lowercase (e.g., category instead of CATEGORY)</li>
          <li>Triggers are now properties on the "data" field value, instead of separate field
types (#23)</li>
          <li>group_ids in common_fields is now just also group_id</li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
