<?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-04" 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-04"/>
    <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>marten@protocol.ai</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="2022" month="October" day="24"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes a high-level schema for a standardized logging format
called qlog.  This format allows easy sharing of data and the creation of reusable
visualization and debugging tools. The high-level schema in this document is
intended to be protocol-agnostic. Separate documents specify how the format should
be used for specific protocol data. The schema is also format-agnostic, and can be
represented in for example JSON, csv or protobuf.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>There is currently a lack of an easily usable, standardized endpoint logging
format. Especially for the use case of debugging and evaluating modern Web
protocols and their performance, it is often difficult to obtain structured logs
that provide adequate information for tasks like problem root cause analysis.</t>
      <t>This document aims to provide a high-level schema and harness that describes the
general layout of an easily usable, shareable, aggregatable and structured logging
format. This high-level schema is protocol agnostic, with logging entries for
specific protocols and use cases being defined in other documents (see for example
<xref target="QLOG-QUIC"/> 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, this document contains concepts such as 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>
      <ul empty="true">
        <li>
          <t>Note to RFC editor: Please remove the follow paragraphs in 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>
      <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 we want to be more 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="top-level">
      <name>The high level qlog schema</name>
      <t>A qlog file should be able to contain several individual traces and logs from
multiple vantage points that are in some way related. To that end, the top-level
element in the qlog schema defines only a small set of "header" fields and an
array of component traces. For this document, the required "qlog_version" field
<bcp14>MUST</bcp14> have a value of "0.3".</t>
      <dl>
        <dt>Note:</dt>
        <dd>
          <t>there have been several previously broadly deployed qlog versions based on older
drafts of this document (see draft-marx-qlog-main-schema). The old values for the
"qlog_version" field were "draft-00", "draft-01" and "draft-02". When qlog was
moved to the QUIC working group, we decided to switch to a new versioning scheme
which is independent of individual draft document numbers. However, we did start
from 0.3, as conceptually 0.0, 0.1 and 0.2 can map to draft-00, draft-01 and
draft-02.</t>
        </dd>
      </dl>
      <t>As qlog can be serialized in a variety of ways, the "qlog_format" field is used to
indicate which serialization option was chosen. Its value <bcp14>MUST</bcp14> either be one of
the options defined in this document (e.g., <xref target="concrete-formats"/>) or the field
must be omitted entirely, in which case it assumes the default value of "JSON".</t>
      <t>In order to make it easier to parse and identify qlog files and their
serialization format, the "qlog_version" and "qlog_format" fields and their values
<bcp14>SHOULD</bcp14> be in the first 256 characters/bytes of the resulting log file.</t>
      <t>An example of the qlog file's top-level structure is shown in <xref target="qlog-file-def"/>.</t>
      <t>Definition:</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
    ? summary: Summary
    ? traces: [+ Trace / TraceError]
}
]]></sourcecode>
      </figure>
      <t>JSON serialization example:</t>
      <figure anchor="qlog-file-ex">
        <name>QlogFile example</name>
        <artwork><![CDATA[
{
    "qlog_version": "0.3",
    "qlog_format": "JSON",
    "title": "Name of this particular qlog file (short)",
    "description": "Description for this group of traces (long)",
    "summary": {
        ...
    },
    "traces": [...]
}
]]></artwork>
      </figure>
      <section anchor="summary">
        <name>Summary</name>
        <t>In a real-life deployment with a large amount of generated logs, it can be useful
to sort and filter logs based on some basic summarized or aggregated data (e.g.,
log length, packet loss rate, log location, presence of error events, ...). The
summary field (if present) <bcp14>SHOULD</bcp14> be on top of the qlog file, as this allows for
the file to be processed in a streaming fashion (i.e., the implementation could
just read up to and including the summary field and then only load the full logs
that are deemed interesting by the user).</t>
        <t>As the summary field is highly deployment-specific, this document does not specify
any default fields or their semantics. Some examples of potential entries are
shown in <xref target="summary"/>.</t>
        <t>Definition:</t>
        <figure anchor="summary-def">
          <name>Summary definition</name>
          <sourcecode type="cddl"><![CDATA[
Summary = {
    ; summary can contain any type of custom information
    ; text here doesn't mean the type text,
    ; but the fact that keys/names in the objects are strings
    * text => any
}
]]></sourcecode>
        </figure>
        <t>JSON serialization example:</t>
        <figure anchor="summary-ex">
          <name>Summary example</name>
          <artwork><![CDATA[
{
    "trace_count": 1,
    "max_duration": 5006,
    "max_outgoing_loss_rate": 0.013,
    "total_event_count": 568,
    "error_count": 2
}
]]></artwork>
        </figure>
      </section>
      <section anchor="traces">
        <name>traces</name>
        <t>It is often advantageous to group several related qlog traces together in a single
file. For example, we can simultaneously perform logging on the client, on the
server and on a single point on their common network path. For analysis, it is
useful to aggregate these three individual traces together into a single file, so
it can be uniquely stored, transferred and annotated.</t>
        <t>As such, the "traces" array contains a list of individual qlog traces. Typical
qlogs will only contain a single trace in this array. These can later be combined
into a single qlog file by taking the "traces" entry/entries for each qlog file
individually and copying them to the "traces" array of a new, aggregated qlog
file. This is typically done in a post-processing step.</t>
        <t>The "traces" array can thus contain both normal traces (for the definition of the
Trace type, see <xref target="trace"/>), but also "error" entries. These indicate that we tried
to find/convert a file for inclusion in the aggregated qlog, but there was an
error during the process. Rather than silently dropping the erroneous file, we can
opt to explicitly include it in the qlog file as an entry in the "traces" array,
as shown in <xref target="trace-error-def"/>.</t>
        <t>Definition:</t>
        <figure anchor="trace-error-def">
          <name>TraceError definition</name>
          <sourcecode type="cddl"><![CDATA[
TraceError = {
    error_description: text
    ; the original URI at which we attempted to find 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 anchor="trace">
        <name>Individual Trace containers</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. As such, a Trace
container contains some metadata in addition to the logged events, see
<xref target="trace-def"/>.</t>
        <t>In the normal use case however, a trace is a log of a single data flow collected
at a single location or vantage point. For example, for QUIC, a single trace only
contains events for a single logical QUIC connection for either the client or the
server.</t>
        <t>The semantics and context of the trace can mainly be deduced from the entries in
the "common_fields" list and "vantage_point" field.</t>
        <t>Definition:</t>
        <figure anchor="trace-def">
          <name>Trace definition</name>
          <sourcecode type="cddl"><![CDATA[
Trace = {
    ? title: text
    ? description: text
    ? configuration: Configuration
    ? common_fields: CommonFields
    ? vantage_point: VantagePoint
    events: [* Event]
}
]]></sourcecode>
        </figure>
        <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)",
    "configuration": {
        "time_offset": 150
    },
    "common_fields": {
        "ODCID": "abcde1234",
        "time_format": "absolute"
    },
    "vantage_point": {
        "name": "backend-67",
        "type": "server"
    },
    "events": [...]
}
]]></artwork>
        </figure>
        <section anchor="configuration">
          <name>Configuration</name>
          <t>We take into account that a qlog file is usually not used in isolation, but by
means of various tools. Especially when aggregating various traces together or
preparing traces for a demonstration, one might wish to persist certain tool-based
settings inside the qlog file itself. For this, the configuration field is used.</t>
          <t>The configuration field can be viewed as a generic metadata field that tools can
fill with their own fields, based on per-tool logic. It is best practice for tools
to prefix each added field with their tool name to prevent collisions across
tools. This document only defines two optional, standard, tool-independent
configuration settings: "time_offset" and "original_uris".</t>
          <t>Definition:</t>
          <figure anchor="configuration-def">
            <name>Configuration definition</name>
            <sourcecode type="cddl"><![CDATA[
Configuration = {
    ; time_offset is in milliseconds
    time_offset: float64
    original_uris:[* text]
    * text => any
}
]]></sourcecode>
          </figure>
          <t>JSON serialization example:</t>
          <figure anchor="configuration-ex">
            <name>Configuration example</name>
            <artwork><![CDATA[
{
    "time_offset": 150,
    "original_uris": [
        "https://example.org/trace1.qlog",
        "https://example.org/trace2.qlog"
    ]
}
]]></artwork>
          </figure>
          <section anchor="timeoffset">
            <name>time_offset</name>
            <t>The time_offset field indicates by how many milliseconds the starting time of the current
trace should be offset. This is useful when comparing logs taken from various
systems, where clocks might not be perfectly synchronous. Users could use manual
tools or automated logic to align traces in time and the found optimal offsets can
be stored in this field for future usage. The default value is 0.</t>
          </section>
          <section anchor="originaluris">
            <name>original_uris</name>
            <t>The original_uris field is used when merging multiple individual qlog files or
other source files (e.g., when converting .pcaps to qlog). It allows to keep
better track where certain data came from. It is a simple array of strings. It is
an array instead of a single string, since a single qlog trace can be made up out
of an aggregation of multiple component qlog traces as well. The default value is
an empty array.</t>
          </section>
          <section anchor="custom-fields">
            <name>custom fields</name>
            <t>Tools can add optional custom metadata to the "configuration" field to store state
and make it easier to share specific data viewpoints and view configurations.</t>
            <t>Two examples from the <eref target="https://qvis.edm.uhasselt.be">qvis toolset</eref> are shown in
<xref target="qvis-config"/>.</t>
            <figure anchor="qvis-config">
              <name>Custom configuration fields example</name>
              <artwork><![CDATA[
{
    "configuration" : {
        "qvis" : {
            "congestion_graph": {
                "startX": 1000,
                "endX": 2000,
                "focusOnEventIndex": 124
            }

            "sequence_diagram" : {
                "focusOnEventIndex": 555
            }
        }
    }
}
]]></artwork>
            </figure>
          </section>
        </section>
        <section anchor="vantage-point">
          <name>vantage_point</name>
          <t>The vantage_point field describes the vantage point from which the trace
originates, see <xref target="vantage-point-def"/>. Each trace can have only a single vantage_point
and thus all events in a trace <bcp14>MUST</bcp14> BE from the perspective of this vantage_point.
To include events from multiple vantage_points, implementers can for example
include multiple traces, split by vantage_point, in a single qlog file.</t>
          <t>Definitions:</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>
      <section anchor="field-name-semantics">
        <name>Field name semantics</name>
        <t>Inside of the "events" field of a qlog trace is a list of events logged by the
endpoint. Each event is specified as a generic object with a number of member
fields and their associated data. Depending on the protocol and use case, the
exact member field names and their formats can differ across implementations. This
section lists the main, pre-defined and reserved field names with specific
semantics and expected corresponding value formats.</t>
        <t>Each qlog event at minimum requires the "time" (<xref target="time-based-fields"/>), "name"
(<xref target="name-field"/>) and "data" (<xref target="data-field"/>) fields. Other typical fields are
"time_format" (<xref target="time-based-fields"/>), "protocol_type" (<xref target="protocol-type-field"/>),
"trigger" (<xref target="trigger-field"/>), and "group_id" <xref target="group-ids"/>. As especially these
later fields typically have identical values across individual event instances,
they are normally logged separately in the "common_fields" (<xref target="common-fields"/>).</t>
        <t>The specific values for each of these fields and their semantics are defined in
separate documents, specific per protocol or use case. For example: event
definitions for QUIC, HTTP/3 and QPACK can be found in <xref target="QLOG-QUIC"/> and
<xref target="QLOG-H3"/>.</t>
        <t>Other fields are explicitly allowed by the qlog approach, and tools <bcp14>SHOULD</bcp14> allow
for the presence of unknown event fields, but their semantics depend on the
context of the log usage (e.g., for QUIC, the ODCID field is used), see
<xref target="QLOG-QUIC"/>.</t>
        <t>An example of a qlog event with its component fields is shown in
<xref target="event-def"/>.</t>
        <t>Definition:</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

    ; events can contain any amount of custom fields
    * text => any
}
]]></sourcecode>
        </figure>
        <t>JSON serialization:</t>
        <figure anchor="event-ex">
          <name>Event example</name>
          <artwork><![CDATA[
{
    "time": 1553986553572,

    "name": "transport: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>The "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 CAN
sort all events on the timestamp before processing them, though are not required
to (as this could impose a significant processing overhead). This can be a problem
especially for multi-threaded and/or streaming loggers, who could consider using a
separate 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>Category and Event Type</name>
          <t>Events differ mainly in the type of metadata associated with them. To help
identify a given event and how to interpret its metadata in the "data" field (see
<xref target="data-field"/>), each event has an associated "name" field. This can be considered
as a concatenation of two other fields, namely event "category" and event "type".</t>
          <t>Category allows a higher-level grouping of events per specific event type. For
example for QUIC and HTTP/3, the different categories could be "transport",
"http", "qpack", and "recovery". Within these categories, the event Type provides
additional granularity. For example for QUIC and HTTP/3, within the "transport"
Category, there would be "packet_sent" and "packet_received" events.</t>
          <t>Logging category and type separately conceptually allows for fast and high-level
filtering based on category and the re-use of event types across categories.
However, it also considerably inflates the log size and this flexibility is not
used extensively in practice at the time of writing.</t>
          <t>As such, the default approach in qlog is to concatenate both field values using
the ":" character in the "name" field, as can be seen in <xref target="name-ex"/>. As
such, qlog category and type names <bcp14>MUST NOT</bcp14> include this character.</t>
          <figure anchor="name-ex">
            <name>Ways of logging category, type and name of an event.</name>
            <artwork><![CDATA[
JSON serialization using separate fields:
{
    "category": "transport",
    "type": "packet_sent"
}

JSON serialization using ":" concatenated field:
{
    "name": "transport:packet_sent"
}
]]></artwork>
          </figure>
          <t>Certain serializations CAN emit category and type as separate fields, and qlog
tools <bcp14>SHOULD</bcp14> be able to deal with both the concatenated "name" field, and the
separate "category" and "type" fields. Text-based serializations however are
encouraged to employ the concatenated "name" field for efficiency.</t>
        </section>
        <section anchor="data-field">
          <name>Data</name>
          <t>The data field is a generic object. It contains the per-event metadata and its
form and semantics are defined per specific sort of event. For example, data
field value 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>protocol_type</name>
          <t>The "protocol_type" array field indicates to which protocols (or protocol
"stacks") this event belongs. This allows a single qlog file to aggregate traces
of different protocols (e.g., a web server offering both TCP+HTTP/2 and
QUIC+HTTP/3 connections).</t>
          <t>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>group_id</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, we need a method for splitting up events belonging
to separate logical entities.</t>
          <t>The simplest way to perform this splitting is by associating a "group identifier"
to each event that indicates to which conceptual "group" each event belongs. A
post-processing step can then extract events per group. However, this group
identifier can be highly protocol and context-specific. In the example above, we
might use QUIC's "Original Destination Connection ID" to uniquely identify a
connection. As such, they might add a "ODCID" field to each event. However, a
middlebox logging IP or TCP traffic might rather use four-tuples to identify
connections, and add a "four_tuple" field.</t>
          <t>As such, to provide consistency and ease of tooling in cross-protocol and
cross-context setups, qlog instead defines the common "group_id" field, which
contains a string value. Implementations are free to use their preferred string
serialization for this field, so long as it contains a unique value per logical
group. Some examples can be seen in <xref target="group-id-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": "transport:packet_received",
        "data": { ... }
    },
    {
        "time": 1553986553581,
        "protocol_type": ["QUIC","HTTP3"],
        "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",
        "name": "transport:packet_sent",
        "data": { ... }
    }
]
]]></artwork>
          </figure>
          <t>Note that in some contexts (for example a Multipath transport protocol) it might
make sense to add additional contextual per-event fields (for example "path_id"),
rather than use the group_id field for that purpose.</t>
          <t>Note also that, typically, a single trace only contains events belonging to a
single logical group (for example, an individual QUIC connection). As such,
instead of logging the "group_id" field with an identical value for each event
instance, this field is typically logged once in "common_fields", see
<xref target="common-fields"/>.</t>
        </section>
        <section anchor="common-fields">
          <name>common_fields</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": "transport:packet_received",
            "data": { ... }
        },{
            "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",
            "protocol_type": ["QUIC","HTTP3"],
            "time_format": "relative",
            "reference_time": 1553986553572,

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

JSON serialization with repeated field values instead
extracted to common_fields:

{
    "common_fields": {
        "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",
        "protocol_type": ["QUIC","HTTP3"],
        "time_format": "relative",
        "reference_time": 1553986553572
    },
    "events": [
        {
            "time": 2,
            "name": "transport:packet_received",
            "data": { ... }
        },{
            "time": 7,
            "name": "http:frame_parsed",
            "data": { ... }
        }
    ]
}
]]></artwork>
          </figure>
          <t>The "common_fields" field is a generic dictionary of key-value pairs, where the
key is always a string and the value can be of any type, but is typically also a
string or number. As such, unknown entries in this dictionary <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>
    <section anchor="guidelines-for-event-definition-documents">
      <name>Guidelines for event definition documents</name>
      <t>This document only defines the main schema for the qlog format. This is intended
to be used together with specific, per-protocol event definitions that specify the
name (category + type) and data needed for each individual event. This is with the
intent to allow the qlog main schema to be easily re-used for several protocols.
Examples include the QUIC event definitions <xref target="QLOG-QUIC"/> and HTTP/3 and QPACK
event definitions <xref target="QLOG-H3"/>.</t>
      <t>This section defines some basic annotations and concepts the creators of event
definition documents <bcp14>SHOULD</bcp14> follow to ensure a measure of consistency, making it
easier for qlog implementers to extrapolate from one protocol to another.</t>
      <section anchor="event-design-guidelines">
        <name>Event design guidelines</name>
        <t>TODO: pending QUIC working group discussion. This text reflects the initial (qlog
draft 01 and 02) setup.</t>
        <t>There are several ways of defining qlog events. In practice, we have seen two main
types used so far: a) those that map directly to concepts seen in the protocols
(e.g., <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, we have typically refrained from adding additional state change events if
those state changes can be directly inferred from data on the wire (for example
flow control limit changes) if the implementation is bug-free and spec-compliant.
Exceptions have been made for common events that benefit from being easily
identifiable or individually logged (for example <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, we recommend that 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 CAN be present in qlog
files. Most of these can be implicitly inferred from data in Core events (if those
contain all their properties), but for many it is better to log the events
explicitly as well, making it clearer how the implementation behaves. These events
are for example tied to passing data around in buffers, to how internal state
machines change and help show when decisions are actually made based on received
data. Tool implementers <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 CAN be present in qlog files and tool
implementers CAN add support for these, but they are not required to.</t>
        <t>Note that in some cases, implementers might not want to log for example data
content details in the "Core" events due to performance or privacy considerations.
In this case, they <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-1">
        <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="generic-events-and-data-classes">
      <name>Generic events and data classes</name>
      <t>There are some event types and data classes that are common across protocols,
applications and use cases that benefit from being defined in a single location.
This section specifies such common definitions.</t>
      <section anchor="raw-info">
        <name>Raw packet and frame information</name>
        <t>While qlog is a more high-level logging format, it also allows the inclusion of
most raw wire image information, such as byte lengths and even raw byte values.
This can be useful when for example investigating or tuning packetization
behavior or determining encoding/framing overheads. However, these fields are not
always necessary and can take up considerable space if logged for each packet or
frame. They can also have a considerable privacy and security impact. As such,
they are grouped in a separate optional field called "raw" of type RawInfo (where
applicable).</t>
        <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 headers and trailers
    ? length: uint64

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

    ; the contents of the full entity,
    ; including headers and trailers
    ? data: hexstring
}
]]></sourcecode>
        </figure>
        <dl>
          <dt>Note:</dt>
          <dd>
            <t>The RawInfo:data field can be truncated for privacy or security
purposes (for example excluding payload data), see <xref target="truncated-values"/>.
In this case, the length properties should still indicate the
non-truncated lengths.</t>
          </dd>
          <dt>Note:</dt>
          <dd>
            <t>We do not specify explicit header_length or trailer_length fields. In
most protocols, header_length can be calculated by subtracting the payload_length
from the length (e.g., if trailer_length is always 0). In protocols with trailers
(e.g., QUIC's AEAD tag), event definitions documents <bcp14>SHOULD</bcp14> define other ways of
logging the trailer_length to make the header_length calculation possible.</t>
          </dd>
          <dt/>
          <dd>
            <t>The exact definitions entities, headers, trailers and payloads depend on the
protocol used. If this is non-trivial, event definitions documents <bcp14>SHOULD</bcp14> include
a clear explanation of how entities are mapped into the RawInfo structure.</t>
          </dd>
          <dt>Note:</dt>
          <dd>
            <t>Relatedly, many modern protocols use Variable-Length Integer Encoded (VLIE) values
in their headers, which are of a dynamic length. Because of this, we cannot
deterministically reconstruct the header encoding/length from non-RawInfo qlog data,
as implementations might not necessarily employ the most efficient VLIE scheme for
all values. As such, to make exact size-analysis possible, implementers should use
explicit lengths in RawInfo rather than reconstructing them from other qlog data.
Similarly, tool developers should only utilize RawInfo (and related information)
in such tools to prevent errors.</t>
          </dd>
        </dl>
      </section>
      <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 could also be reflected in the top-level qlog's <tt>summary</tt> or
<tt>configuration</tt> fields, but having a separate event allows easier 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="concrete-formats">
      <name>Serializing qlog</name>
      <t>This document and other related qlog schema definitions are intentionally
serialization-format agnostic. This means that implementers themselves can choose
how to represent and serialize qlog data practically on disk or on the wire. Some
examples of possible formats are JSON, CBOR, CSV, protocol buffers, flatbuffers,
etc.</t>
      <t>All these formats make certain tradeoffs between flexibility and efficiency, with
textual formats like JSON typically being more flexible but also less efficient
than binary formats like protocol buffers. The format choice will depend on the
practical use case of the qlog user. For example, for use in day to day debugging,
a plaintext readable (yet relatively large) format like JSON is probably
preferred. However, for use in production, a more optimized yet restricted format
can be better. In this latter case, it will be more difficult to achieve
interoperability between qlog implementations of various protocol stacks, as some
custom or tweaked events from one might not be compatible with the format of the
other. This will also reflect in tooling: not all tools will support all formats.</t>
      <t>This being said, the authors prefer JSON as the basis for storing qlog,
as it retains full flexibility and maximum interoperability. Storage
overhead can be managed well in practice by employing compression. For
this reason, this document details 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. We
discuss concrete options to bring down JSON size and processing
overheads in <xref target="optimizations"/>.</t>
      <t>As depending on the employed format different deserializers/parsers should be
used, the "qlog_format" field is used to indicate the chosen serialization
approach. This field is always a string, but can be made hierarchical by the use
of the "." separator between entries. For example, a value of "JSON.optimizationA"
can indicate that a default JSON format is being used, but that a certain
optimization of type A was applied to the file as well (see also
<xref target="optimizations"/>).</t>
      <section anchor="format-json">
        <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>One of the downsides of using pure JSON is that it is inherently a non-streamable
format. Put differently, it is not possible to simply append new qlog events to a
log file without "closing" this file at the end by appending "]}]}". Without these
closing tags, most JSON parsers will be unable to parse the file entirely. As most
platforms do not provide a standard streaming JSON parser (which would be able to
deal with this problem), this document also provides a qlog mapping to a
streamable JSON format called JSON Text Sequences (JSON-SEQ) (<xref target="RFC7464"/>).</t>
        <t>When mapping qlog to JSON-SEQ, the "qlog_format" field <bcp14>MUST</bcp14> have the value
"JSON-SEQ".</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>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>Definition:</t>
        <figure anchor="trace-seq-def">
          <name>TraceSeq definition</name>
          <sourcecode type="cddl"><![CDATA[
TraceSeq = {
    ? title: text
    ? description: text
    ? configuration: Configuration
    ? common_fields: CommonFields
    ? vantage_point: VantagePoint
}
]]></sourcecode>
        </figure>
        <t>Definition:</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
    ? summary: Summary
    trace: TraceSeq
}
]]></sourcecode>
        </figure>
        <t>JSON-SEQ serialization examples:</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.3",
    "qlog_format": "JSON-SEQ",
    "title": "Name of JSON Text Sequence qlog file (short)",
    "description": "Description for this trace file (long)",
    "summary": {
        ...
    },
    "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": "transport:parameters_set", "data": { ... } }
<RS>{"time": 7, "name": "transport:packet_sent", "data": { ... } }
...
]]></artwork>
        </figure>
        <t>Note: 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, we compared a multitude of alternative formatting
and optimization options. The results of this study are <eref target="https://github.com/quiclog/internet-drafts/issues/30#issuecomment-617675097">summarized on the qlog
github
repository</eref>.
The rest of this section discusses some of these approaches implementations could
choose and the expected gains and tradeoffs inherent therein. Tools <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. We choose
to define these schemes in separate documents to keep the main qlog definition
clean and generalizable, as not all contexts require the same performance or
flexibility as others and qlog is intended to be a broadly usable and extensible
format (for example more flexibility is needed in earlier stages of protocol
development, while more performance is typically needed in later stages). This is
also the main reason why the general qlog format is the less optimized JSON
instead of a more performant option.</t>
        <t>To be able to easily distinguish between these options in qlog compatible tooling
(without the need to have the user provide out-of-band information or to
(heuristically) parse and process files in a multitude of ways, see also
<xref target="tooling"/>), we recommend using explicit file extensions to indicate specific
formats. As there are no standards in place for this type of extension to format
mapping, we employ a commonly used scheme here. Our approach is to list the
applied optimizations in the extension in ascending order of application (e.g., if
a qlog file is first optimized with technique A and then compressed with technique
B, the resulting file would have the extension ".(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="top-level"/>).</t>
          <t>The second option is to replace field values and/or names with indices into a
(dynamic) lookup table. This is a common compression technique and can provide
significant file size reductions (up to 50% in our tests, 100MB to 50MB). However,
this approach is even more difficult to implement efficiently and requires either
including the (dynamic) table in the resulting file (an approach taken by for
example <eref target="https://www.chromium.org/developers/design-documents/network-stack/netlog">Chromium's NetLog
format</eref>)
or defining a (static) table up-front and sharing this between implementations.
Implementations using this approach should not employ a separate file extension
(as it still uses JSON), but rather employ a new value of "JSON.dictionary" (or
"JSON-SEQ.dictionary") for the "qlog_format" field (see <xref target="top-level"/>).</t>
          <t>As both options either proved difficult to implement, reduced qlog file
readability, and provided too little improvement compared to other more
straightforward options (for example <xref target="compression"/>), these schemes are not
inherently part of qlog.</t>
        </section>
        <section anchor="compression">
          <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 our tests, even for "fast" compression levels). As such, utilizing
compression is recommended before attempting other optimization options, even
though this might (somewhat) increase processing costs due to the additional
compression step.</t>
          <t>The first option is to use GZIP compression (<xref target="RFC1952"/>). This generic
compression scheme provides multiple compression levels (providing a trade-off
between compression speed and size reduction). Utilized at level 6 (a medium
setting thought to be applicable for streaming compression of a qlog stream in
commodity devices), gzip compresses qlog JSON files to 7% of their initial size on
average (100MB to 7MB). For this option, the file extension .(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). We
mainly recommend gzip and brotli because of their tweakable behaviour and wide
support in web-based environments, which we envision as the main tooling ecosystem
(see also <xref target="tooling"/>).</t>
        </section>
        <section anchor="binary">
          <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 our purposes, 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. Our straightforward mapping of the qlog main
schema and QUIC/HTTP3 event types to protobuf created qlog files 24% as large as
the raw JSON equivalents (100MB to 24MB). For this option, the file extension
.(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, we feel the more flexible
compressed textual JSON options are 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, we can also consider other structured logging approaches that contain
similar (though typically not identical) data to qlog, like raw packet capture
files (for example .pcap files from tcpdump) or endpoint-specific logging formats
(for example the NetLog format in Google Chrome). These are sometimes the only
options, if an implementation cannot or will not support direct qlog output for
any reason, but does provide other internal or external (e.g., SSLKEYLOGFILE
export to allow decryption of packet captures) logging options For this second
category, a (partial) transformation from/to qlog can also be defined.</t>
        <t>As such, when defining a new qlog serialization format or wanting to utilize
qlog-compatible tools with existing codebases lacking qlog support, it is
recommended to define and provide a concrete mapping from one format to default
JSON-serialized qlog. Several of such mappings exist. Firstly,
[pcap2qlog]((https://github.com/quiclog/pcap2qlog) transforms QUIC and HTTP/3
packet capture files to qlog. Secondly,
<eref target="https://github.com/quiclog/qvis/tree/master/visualizations/src/components/filemanager/netlogconverter">netlog2qlog</eref>
converts chromium's internal dictionary-encoded JSON format to qlog. Finally,
<eref target="https://github.com/quiclog/quictrace2qlog">quictrace2qlog</eref> converts the older
quictrace format to JSON qlog. Tools can then easily integrate with these
converters (either by incorporating them directly or for example using them as a
(web-based) API) so users can provide different file types with ease. For example,
the <eref target="https://qvis.edm.uhasselt.be">qvis</eref> toolsuite supports a multitude of formats
and qlog serializations.</t>
      </section>
    </section>
    <section anchor="methods-of-access-and-generation">
      <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, we define two
environment variables. 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 anchor="access-logs-via-a-well-known-endpoint">
        <name>Access logs via a well-known endpoint</name>
        <t>After generation, qlog implementers <bcp14>MAY</bcp14> make available generated logs and traces
on an endpoint (typically the server) via the following .well-known URI:</t>
        <ul empty="true">
          <li>
            <t>.well-known/qlog/IDENTIFIER.extension</t>
          </li>
        </ul>
        <t>The IDENTIFIER variable depends on the context and the protocol. For example for
QUIC, the lowercase Original Destination Connection ID (ODCID) is recommended, as
it can uniquely identify a connection. Additionally, the extension depends on the
chosen format (see <xref target="format-summary"/>). For example, for a QUIC connection with
ODCID "abcde", the endpoint for fetching its default JSON-formatted .qlog file
would be:</t>
        <ul empty="true">
          <li>
            <t>.well-known/qlog/abcde.qlog</t>
          </li>
        </ul>
        <t>Implementers <bcp14>SHOULD</bcp14> allow users to fetch logs for a given connection on a 2nd,
separate connection. This helps prevent pollution of the logs by fetching them
over the same connection that one wishes to observe through the log. Ideally, for
the QUIC use case, the logs should also be approachable via an HTTP/2 or HTTP/1.1
endpoint (i.e., on TCP port 443), to for example aid debugging in the case where
QUIC/UDP is blocked on the network.</t>
        <t>qlog implementers <bcp14>SHOULD NOT</bcp14> enable this .well-known endpoint in typical
production settings to prevent (malicious) users from downloading logs from other
connections. Implementers are advised to disable this endpoint by default and
require specific actions from the end users to enable it (and potentially qlog
itself). Implementers <bcp14>MUST</bcp14> also take into account the general privacy and security
guidelines discussed in <xref target="privacy"/> before exposing qlogs to outside actors.</t>
      </section>
    </section>
    <section anchor="tooling">
      <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>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>TODO: primarily the .well-known URI</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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="C. Vigano" initials="C." surname="Vigano">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <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="RFC6839">
          <front>
            <title>Additional Media Type Structured Syntax Suffixes</title>
            <author fullname="T. Hansen" initials="T." surname="Hansen">
              <organization/>
            </author>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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="RFC7464">
          <front>
            <title>JavaScript Object Notation (JSON) Text Sequences</title>
            <author fullname="N. Williams" initials="N." surname="Williams">
              <organization/>
            </author>
            <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="RFC8091">
          <front>
            <title>A Media Type Structured Syntax Suffix for JSON Text Sequences</title>
            <author fullname="E. Wilde" initials="E." surname="Wilde">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="Z. Szabadka" initials="Z." surname="Szabadka">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig">
              <organization/>
            </author>
            <author fullname="B. Aboba" initials="B." surname="Aboba">
              <organization/>
            </author>
            <author fullname="J. Peterson" initials="J." surname="Peterson">
              <organization/>
            </author>
            <author fullname="J. Morris" initials="J." surname="Morris">
              <organization/>
            </author>
            <author fullname="M. Hansen" initials="M." surname="Hansen">
              <organization/>
            </author>
            <author fullname="R. Smith" initials="R." surname="Smith">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="B. Overeinder" initials="B." surname="Overeinder">
              <organization/>
            </author>
            <author fullname="R. van Rijswijk-Deij" initials="R." surname="van Rijswijk-Deij">
              <organization/>
            </author>
            <author fullname="A. Mankin" initials="A." surname="Mankin">
              <organization/>
            </author>
            <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>KU Leuven</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Facebook</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
              <organization>Protocol Labs</organization>
            </author>
            <date day="31" month="August" year="2022"/>
            <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].

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-02"/>
        </reference>
        <reference anchor="QLOG-H3">
          <front>
            <title>HTTP/3 and QPACK qlog event definitions</title>
            <author fullname="Robin Marx" initials="R." surname="Marx">
              <organization>KU Leuven</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Facebook</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
              <organization>Protocol Labs</organization>
            </author>
            <date day="31" month="August" year="2022"/>
            <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].

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-h3-events-02"/>
        </reference>
        <reference anchor="RFC8742">
          <front>
            <title>Concise Binary Object Representation (CBOR) Sequences</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="M. Kuehlewind" initials="M." surname="Kuehlewind">
              <organization/>
            </author>
            <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 anchor="change-log">
      <name>Change Log</name>
      <section 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 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 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 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 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 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 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>
    <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>
  </back>
  <!-- ##markdown-source:
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
veSKXYsKcBxN07cMZ7UEygHEVIglcIL8Hr01Ao2RZ/Tiu7ym+sDtA7RS7CrE
QT5yA8rY+89Pi6giYGi6MExjccqNkuxqVSc8T/KKh/GVfEJ8FpuhGw/OK8wk
670wjKXHjJYo7PVRCKSdPu5xINBA00JkxwXKiHacM2/lNaj1zC2vLVRxxkke
4Sg4aeM4qT567+bpS0TFSB/H+YCDTp9bCxyWVLZs6mG74apNBJV0cNHQ1G+p
Y8H17/j6EPMOQw9N89grTzu3mopPtND+jvB8MmkRB4BvfxhvhJOvTLsjm2+z
btSbbaI57p2jPqRdwCOmOHeNKkK7m6prLH7mSFkIAVu0lLRMEr17Fz04C2XZ
gMjLQMIQZ2Ubq0Gy86oGrQXqlLHslG5TUMsd/76xWUsp2W80ad6ptpvxtpK/
OTKT7NKvLVoT/64cN36eqO2ghEwoh+sru8BAp4+TarcI/8SlNvu+fNT7sf+h
k1f6tkcUjTjcm6ev8Q9MtBPLLuU74gzTcn383cnR0fH4zt3p+Pjk5sn4+Nat
8f1b9++N78zmd8bzW7ePxsfHR5Pdel76X7k+CXefTOjK6fF4fHz/3gAC9fi7
2/ePj27z3yff3TuKvSbXRih8xC26OE2ojb0rn12me8efXaZ92bc76/OVGbhf
nleUIHztnNxPqdoR0XaXOveCp1mjAOUQaZIDHbVnXKOXt+eZH57n9H0cS+Z/
jsveabwiu5mzBR1Xnw05FWwo1XiT1/XwIqxif+DqCGDQUj68qhScRtJodlMj
PUabAVj6JQORm5dgLz5X4Cldkc+zcB2gLpHTaZ1lvoozkjonth+EkIvwEny2
1h5oOa13WnVLTEKunJRYmDk3iDhmmtv1FZ4Ld53nIrmWFNP0ql3lNE5JtaZP
3C097feb+1KgqIqBNcZGTCRIDK6jM3QvOaJWhCRis1vn1e0Lxx4SdMUEGZgy
zLY649ROLfRp7TI4M2ZZfuSkxUiZ9dpypz2yPyplUh/HXiVNnUuJuuOMJKkc
dr3PmtESjVl64pTpRU1+z4MCZunXwdFis/GlcHWkJLQdggn2f4d+k1PxecC6
HermvojaeSZ0mlUYDEsjC7mgqnf4ZOp9aHMu7nfUIjnquj4BmcfXZoQNcXwl
HkBOKeu0IFHHrcI5NWmRFG+7ZK/q6fGLGA65Uz2x216gbDr2bnJodtJX92gH
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
OIIddKZZZRj+/wMLIj2NWlIBAA==

-->

</rfc>
