<?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-rfc2629 version 1.6.2 (Ruby 3.0.3) -->
<?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-02" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.3 -->
  <front>
    <title>Main logging schema for qlog</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-02"/>
    <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
      <organization>KU Leuven</organization>
      <address>
        <email>robin.marx@kuleuven.be</email>
      </address>
    </author>
    <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
      <organization>Facebook</organization>
      <address>
        <email>lniccolini@fb.com</email>
      </address>
    </author>
    <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
      <organization>Protocol Labs</organization>
      <address>
        <email>marten@protocol.ai</email>
      </address>
    </author>
    <date year="2022" month="March" day="07"/>
    <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>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 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in <xref target="RFC2119"/>.</t>
        <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>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">
          <name>Serialization</name>
          <t>While the qlog schemas are format-agnostic, and can be serialized in
many ways (e.g., JSON, CBOR, protobuf, ...), this document only
describes how to employ <xref target="JSON"/>, its subset
<xref target="I-JSON"/>, and its streamable derivative
<xref target="JSON-Text-Sequences"/> as textual serialization options. As
such, examples are provided in <xref target="JSON"/>. Other documents may
describe how to utilize other concrete serialization options, though
tips and requirements for these are also listed in this document
(<xref target="concrete-formats"/>).</t>
        </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>Flexibility in the format, complexity in the tooling (e.g., few components are a
MUST, tools need to deal with this)</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 indivdual traces and logs from
multiple vantage points that are in some way related. To that end, the top-level
element in the qlog schema defines only a small set of "header" fields and an
array of component traces. For this document, the required "qlog_version" field
MUST have a value of "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 MUST either be one of
the options defined in this document (e.g., <xref target="concrete-formats"/>) or the field
must be omitted entirely, in which case it assumes the default value of "JSON".</t>
      <t>In order to make it easier to parse and identify qlog files and their
serialization format, the "qlog_version" and "qlog_format" fields and their values
SHOULD be in the first 256 characters/bytes of the resulting log file.</t>
      <t>An example of the qlog file's top-level structure is shown in <xref target="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) SHOULD be on top of the qlog file, as this allows for
the file to be processed in a streaming fashion (i.e., the implementation could
just read up to and including the summary field and then only load the full logs
that are deemed interesting by the user).</t>
        <t>As the summary field is highly deployment-specific, this document does not specify
any default fields or their semantics. Some examples of potential entries are
shown in <xref target="summary"/>.</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 MUST BE from the perspective of this vantage_point.
To include events from multiple vantage_points, implementers can for example
include multiple traces, split by vantage_point, in a single qlog file.</t>
          <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 SHOULD allow
for the presence of unknown event fields, but their semantics depend on the
context of the log usage (e.g., for QUIC, the ODCID field is used), see
<xref target="QLOG-QUIC"/>.</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 occured. Its value is
typically the Unix timestamp since the 1970 epoch (number of milliseconds since
midnight UTC, January 1, 1970, ignoring leap seconds). However, qlog supports two
more succint timestamps formats to allow reducing file size. The employed format
is indicated in the "time_format" field, which allows one of three values:
"absolute", "delta" or "relative".</t>
          <t>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 MUST
include a timestamp in the "time" field.</t>
          <t>Events in each individual trace SHOULD be logged in strictly ascending timestamp
order (though not necessarily absolute value, for the "delta" format). Tools CAN
sort all events on the timestamp before processing them, though are not required
to (as this could impose a significant processing overhead). This can be a problem
especially for multi-threaded and/or streaming loggers, who could consider using a
separate postprocesser to order qlog events in time if a tool do not provide this
feature.</t>
          <t>Timestamps do not have to use the UNIX epoch timestamp as their reference. For
example for privacy considerations, any initial reference timestamps (for example
"endpoint uptime in ms" or "time since connection start in ms") can be chosen.
Tools SHOULD NOT assume the ability to derive the absolute Unix timestamp from
qlog traces, nor allow on them to relatively order events across two or more
separate traces (in this case, clock drift should also be taken into account).</t>
        </section>
        <section anchor="name-field">
          <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 MUST NOT 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 SHOULD be able to deal with both the concatenated "name" field, and the
separate "category" and "type" fields. Text-based serializations however are
encouraged to employ the concatenated "name" field for efficiency.</t>
        </section>
        <section anchor="data-field">
          <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 definitons 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 MUST 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="data-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 occuring, 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: { ... }
        },{
            7,
            name: "http:frame_parsed",
            data: { ... }
        }
    ]
}
]]></artwork>
          </figure>
          <t>The "common_fields" field is a generic dictionary of key-value pairs, where the
key is always a string and the value can be of any type, but is typically also a
string or number. As such, unknown entries in this dictionary MUST be disregarded
by the user and tools (i.e., the presence of an uknown field is explicitly NOT an
error).</t>
          <t>The list of default qlog fields that are typically logged in common_fields (as
opposed to as individual fields per event instance) are 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 MUST be able to deal with these fields being defined either on each event
individually or combined in common_fields. Note that if at least one event in a
trace has a different value for a given field, this field MUST NOT be added to
common_fields but instead defined on each event individually. Good example of such
fields are "time" and "data", who are divergent by nature.</t>
        </section>
      </section>
    </section>
    <section anchor="guidelines-for-event-definition-documents">
      <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 SHOULD follow to ensure a measure of consistency, making it
easier for qlog implementers to extrapolate from one protocol to another.</t>
      <section anchor="event-design-guidelines">
        <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 behaviours 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 SHOULD have an
"importance indicator" with one of three values, in decreasing order of importance
and exptected usage:</t>
        <ul spacing="normal">
          <li>Core</li>
          <li>Base</li>
          <li>Extra</li>
        </ul>
        <t>The "Core" events are the events that SHOULD be present in all qlog files for a
given protocol. These are typically tied to basic packet and frame parsing and
creation, as well as listing basic internal metrics. Tool implementers SHOULD
expect and add support for these events, though SHOULD NOT expect all Core events
to be present in each qlog trace.</t>
        <t>The "Base" events add additional debugging options and CAN be present in qlog
files. Most of these can be implicitly inferred from data in Core events (if those
contain all their properties), but for many it is better to log the events
explicitly as well, making it clearer how the implementation behaves. These events
are for example tied to passing data around in buffers, to how internal state
machines change and help show when decisions are actually made based on received
data. Tool implementers SHOULD at least add support for showing the contents of
these events, if they do not handle them explicitly.</t>
        <t>The "Extra" events are considered mostly useful for low-level debugging of the
implementation, rather than the protocol. They allow more fine-grained tracking of
internal behaviour. As such, they CAN be present in qlog files and tool
implementers CAN add support for these, but they are not required to.</t>
        <t>Note that in some cases, implementers might not want to log for example data
content details in the "Core" events due to performance or privacy considerations.
In this case, they SHOULD use (a subset of) relevant "Base" events instead to
ensure usability of the qlog output. As an example, implementations that do not
log QUIC <tt>packet_received</tt> events and thus also not which (if any) ACK frames the
packet contains, SHOULD 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 SHOULD NOT expect non-specialized tools to recognize or visualize
this custom data. However, tools SHOULD make an effort to visualize even unknown
data if possible in the specific tool's context. If they do not, they MUST ignore
these unknown fields.</t>
      </section>
    </section>
    <section anchor="generic-events-and-data-classes">
      <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
behaviour or determining encoding/framing overheads. However, these fields are not
always necessary and can take up considerable space if logged for each packet or
frame. They can also have a considerable privacy and security impact. As such,
they are grouped in a separate optional field called "raw" of type RawInfo (where
applicable).</t>
        <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 subtracing the payload_length
from the length (e.g., if trailer_length is always 0). In protocols with trailers
(e.g., QUIC's AEAD tag), event definitions documents SHOULD define other ways of
logging the trailer_length to make the header_length calculation possible.</t>
          </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 SHOULD 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
deterministally reconstruct the header encoding/length from non-RawInfo qlog data,
as implementations might not necessarily employ the most efficient VLIE scheme for
all values. As such, to make exact size-analysis possible, implementers should use
explicit lengths in RawInfo rather than reconstructing them from other qlog data.
Similarly, tool developers should only utilize RawInfo (and related information)
in such tools to prevent errors.</t>
          </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 MUST 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 SHOULD
be ".qlog" and the Media Type (if any) SHOULD be "application/qlog+json"
per <xref target="RFC6839"/>.</t>
        <t>JSON files by definition (<xref target="RFC8259"/>) MUST utilize the UTF-8 encoding,
both for the file itself and the string values.</t>
        <t>While not specifically required by the JSON specification, all qlog field
names in a JSON serialization MUST 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"/> SHOULD 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 SHOULD 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 MUST
be able to deal with this situation and derive the length of the field
from the raw value if no separate length-indicating field is present.
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 MUST have the value
"JSON-SEQ".</t>
        <t>When using JSON-SEQ serialization, the file extension/suffix SHOULD be
".sqlog" (for "streaming" qlog) and the Media Type (if any) SHOULD 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 MUST 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"/> SHOULD 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 optimizated 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 SHOULD support
mainly the compression options listed in <xref target="compression"/>, as they provide the
largest wins for the least cost overall.</t>
        <t>Over time, specific qlog formats and encodings can be created that more formally
define and combine some of the discussed optimizations or add new ones. We choose
to define these schemes in separate documents to keep the main qlog definition
clean and generalizable, as not all contexts require the same performance or
flexibility as others and qlog is intended to be a broadly usable and extensible
format (for example more flexibility is needed in earlier stages of protocol
development, while more performance is typically needed in later stages). This is
also the main reason why the general qlog format is the less optimized JSON
instead of a more performant option.</t>
        <t>To be able to easily distinguish between these options in qlog compatible tooling
(without the need to have the user provide out-of-band information or to
(heuristically) parse and process files in a multitude of ways, see also
<xref target="tooling"/>), we recommend using explicit file extensions to indicate specific
formats. As there are no standards in place for this type of extension to format
mapping, we employ a commonly used scheme here. Our approach is to list the
applied optimizations in the extension in ascending order of application (e.g., if
a qlog file is first optimized with technique A and then compressed with technique
B, the resulting file would have the extension ".(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 SHOULD 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 SHOULD 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 straighforward
binary variant of JSON. As such, existing JSON qlog files can be trivially
converted to and from CBOR (though slightly more work is needed for 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 SHOULD 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 SHOULD BE used. The "qlog_format" field should reflect the
different internal format, for example: "qlog_format": "protobuf".</t>
          <t>Note that binary formats can (and should) also be used in conjunction with
compression (see <xref target="compression"/>). For example, CBOR compresses well (to about 6%
of the original textual JSON size (100MB to 6MB) for both gzip and brotli) and so
does protobuf (5% (gzip) to 3% (brotli)). However, these gains are similar to the
ones achieved by simply compression the textual JSON equivalents directly (7%, see
<xref target="compression"/>). As such, since compression is still needed to achieve optimal
file size reductions event with binary formats, we feel the more flexible
compressed textual JSON options are a better default for the qlog format in
general.</t>
          <t/>
        </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 MUST include the full file
extension. The second, QLOGDIR, sets a general directory path in which qlog files
should be placed. This path MUST include the directory separator character at the
end.</t>
        <t>In general, QLOGDIR should be preferred over QLOGFILE if an endpoint is prone to
generate multiple qlog files. This can for example be the case for a QUIC server
implementation that logs each QUIC connection in a separate qlog file. An
alternative that uses QLOGFILE would be a QUIC server that logs all connections in
a single file and uses the "group_id" field (<xref target="group-ids"/>) to allow post-hoc
separation of events.</t>
        <t>Implementations SHOULD provide support for QLOGDIR and MAY provide support for
QLOGFILE.</t>
        <t>When using QLOGDIR, it is up to the implementation to choose an appropriate naming
scheme for the qlog files themselves. The chosen scheme will typically depend on
the context or protocols used. For example, for QUIC, it is recommended to use the
Original Destination Connection ID (ODCID), followed by the vantage point type of
the logging endpoint. Examples of all options for QUIC are shown in
<xref target="qlogdir-example"/>.</t>
        <figure 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 MAY 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 SHOULD allow users to fetch logs for a given connection on a 2nd,
separate connection. This helps prevent pollution of the logs by fetching them
over the same connection that one wishes to observe through the log. Ideally, for
the QUIC use case, the logs should also be approachable via an HTTP/2 or HTTP/1.1
endpoint (i.e., on TCP port 443), to for example aid debugging in the case where
QUIC/UDP is blocked on the network.</t>
        <t>qlog implementers SHOULD NOT enable this .well-known endpoint in typical
production settings to prevent (malicious) users from downloading logs from other
connections. Implementers are advised to disable this endpoint by default and
require specific actions from the end users to enable it (and potentially qlog
itself). Implementers MUST also take into account the general privacy and security
guidelines discussed in <xref target="privacy"/> before exposing qlogs to outside actors.</t>
      </section>
    </section>
    <section anchor="tooling">
      <name>Tooling requirements</name>
      <t>Tools ingestion qlog MUST indicate which qlog version(s), qlog format(s),
compression methods and potentially other input file formats (for example .pcap)
they support. Tools SHOULD at least support .qlog files in the default JSON format
(<xref target="format-json"/>). Additionally, they SHOULD indicate exactly which values for and
properties of the name (category and type) and data fields they look for to
execute their logic. Tools SHOULD perform a (high-level) check if an input qlog
file adheres to the expected qlog schema. If a tool determines a qlog file does
not contain enough supported information to correctly execute the tool's logic, it
SHOULD generate a clear error message to this effect.</t>
      <t>Tools MUST NOT produce breaking errors for any field names and/or values in the
qlog format that they do not recognize. Tools SHOULD indicate even unknown event
occurences within their context (e.g., marking unknown events on a timeline for
manual interpretation by the user).</t>
      <t>Tool authors should be aware that, depending on the logging implementation, some
events will not always be present in all traces. For example, using a circular
logging buffer of a fixed size, it could be that the earliest events (e.g.,
connection setup events) are later overwritten by "newer" events. Alternatively,
some events can be intentionally omitted out of privacy or file size
considerations. Tool authors are encouraged to make their tools robust enough to
still provide adequate output for incomplete logs.</t>
    </section>
    <section anchor="privacy">
      <name>Security and privacy considerations</name>
      <t>TODO : discuss privacy and security considerations (e.g., what NOT to log, what to
strip out of a log before sharing, ...)</t>
      <t>TODO: strip out/don't log IPs, ports, specific CIDs, raw user data, exact times,
HTTP HEADERS (or at least :path), SNI values</t>
      <t>TODO: see if there is merit in encrypting the logs and having the server choose an
encryption key (e.g., sent in transport parameters)</t>
      <t>Good initial reference: <eref target="https://huitema.wordpress.com/2020/07/21/scrubbing-quic-logs-for-privacy/">Christian Huitema's
blogpost</eref></t>
    </section>
    <section anchor="iana-considerations">
      <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="QLOG-QUIC">
          <front>
            <title>QUIC event definitions for qlog</title>
            <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
              <organization>KU Leuven</organization>
            </author>
            <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
              <organization>Facebook</organization>
            </author>
            <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
              <organization>Protocol Labs</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-00"/>
        </reference>
        <reference anchor="QLOG-H3">
          <front>
            <title>HTTP/3 and QPACK event definitions for qlog</title>
            <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
              <organization>KU Leuven</organization>
            </author>
            <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
              <organization>Facebook</organization>
            </author>
            <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
              <organization>Protocol Labs</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-h3-events-00"/>
        </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="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="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>
      </references>
      <references>
        <name>Informative References</name>
        <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="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>
      </references>
    </references>
    <section anchor="change-log">
      <name>Change Log</name>
      <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 anchor="design-variations">
      <name>Design Variations</name>
      <ul spacing="normal">
        <li>
          <eref target="https://github.com/google/quic-trace">Quic-trace</eref> takes a slightly different
approach based on protocolbuffers.</li>
        <li>
          <eref target="https://github.com/EricssonResearch/spindump">Spindump</eref> also defines a custom
text-based format for in-network measurements</li>
        <li>
          <eref target="https://www.wireshark.org/">Wireshark</eref> also has a QUIC dissector and its
results can be transformed into a json output format using tshark.</li>
      </ul>
      <t>The idea is that qlog is able to encompass the use cases for both of these
alternate designs and that all tooling converges on the qlog standard.</t>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Much of the initial work by Robin Marx was done at Hasselt University.</t>
      <t>Thanks to Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen Petrides, Jari
Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind, Jeremy Laine and Lucas
Pardue for their feedback and suggestions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAIZcJmIAA+296ZYb15Um+v88RRTYXgJkADlwhlvlokhKThcnk5TUblqL
DACRmWECCDgikEk4i/U+/Q79r1+s97eHMwSQJCX73rtWratVZSKBiDOfPe9v
j0Yj15btophkT/NylS2qs7NydZY1s/NimWenVZ39jb5z82q2ypf01LzOT9tR
WbSno79tytkIv46W9OpIXhkdHrtZ3hZnVb2dZE07d65c15OsrTdNe3x4eJ9+
z+sin2Sv63zVrKu6dZdV/f6srjbrSfanH04euvfFlr6aT7KTVVvUq6IdPUKv
zjVtvpq/zRfVikayLRq3LifZm7aaDTMaYLmaF6t2mDXUZl2cNvRpu9QPbV3O
6KdZtVzn+mFJD9NP5WpRroqfncs37XlVT1yWjej/M/qhmWQvx7Qu9Qf+Qhbg
ZTWldfJfVvXZJPv3H7InxeaiWPFXtArlYpLVeHC8pAf/7f1mwT+PpwU/UVdY
8GJetlWd9vdknD0rZ7OKxlRGnT7ZzPLOD9zxd/msmFbV+7jfxcqe+7fT6Zgm
+pkun46zVwW9u1pFHdL82mKV/MAdvqgrWu5qkT3Jp03c65Jf+Le1/j7Oy91u
3aqql3lbXhRY5T89ef79CPs94Sf1FPbwTVbQYrXZvDilWbRltWr8Sezxw3M6
YZPs6tGD148/8hdNUZdFU65OK2kt65ydaw4uf+LOmtHhIb8ZjgH+G+m/e47D
tUfimmOxZxf29LBzAD55CPYfhC/rqbPvn9z7T+z/7i7r1v7hZrqxf3j9+sXB
zYxucPanFw8e/vv/a5t8fvP/3+J/8hZjD/xVdqPRKKNn25pIq3Ovz8sG5Hiz
lO1tZnU5LZosz87Ls/PRgvZiEfOXPGOyntfz8u/F3HMg6YB4yWJB32Ijx1nG
bcsvGf1QXTZZkTfbrDnPa7xUneLU5HzI2vMimxGnwdHCD3WxafLponAXZbPJ
F+Xf5Rc8Oi+mG+m1rapFM6Z+ij2jpRPQJpMrG1oJWsg5jbCtsmmRGf0b5Wer
qmnLGXZgndd0lP1rTdasi1l5us3Oq0seps6oOa82i7mjZjYNtYjFkSfLmW+Y
5ycDtFHR0i6aShvxHQ95ZrN8RcNydbGui4b6pmZpFmi5+JAv14si++Or58+I
HzYXtPvSy3RzOpZNXZbzOS2Yu4GLVlfzzQxLhi0u6gIdzzZ1Ta0utrSLi3z2
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
OgChaA1JnIGIs+t0sVWVc6gaNO1ZMVelagWHHmlxid+38HxJ7abe+Zuz+aIj
u0c7MIYdluTdhfsb84nLksgWUzJ/P228/IIXXbkfJumN7A02l+VeWskppFyX
TjfwbRC9/L1RUz9ytrgeRDEKYqHz77kwA2igsKhV6602s/Ru3nQhEHgBJWcY
8zcOnJVT9lp9IK2sAogs5Hae97pq2pHyE1aO2mKtEQnd5WZatGn8ok0rYt8c
VOlPQd/MGoFgKINzIpuBkMFICXciv0Oy/5CpGZuh5Ob2jBzb0nt1hSndJbap
pLWn1aBe5gfs6YA8IEsv5hL19Bsx7KzM0CgovPQwaK6cMHOiSbZpuirj7GUu
Hohzvp0LCTma15X4DvEo3uULqwderrIjlYjNlepMW2yVybL+EZsfeNy5Wt7p
hNiP6RYMXZ4I7fzjiMftxfZr2FSQiD2nEiK5X9j+nTCQuiSSQ7v7w8sTRBKI
5nWJeIa2WK5b0bSxBZkJKCqT0yImoruSzLdMjybZj/LnC/aqBgbUmY8R52js
v0xIj7nQzmwhPrPYyhIRixMWnWCiMs0CTx009cWBbMRBW83z7QHIQNOOOVhU
n01mCOGajzq9LZS5l30MXGhnsoERRXONeBHMPmrvWon9F7YuNqUxGTJbXxJM
o1cypm4RmYEQVsNG7EPdVBDtmVFRldahBbWY9Zp/H5XzRsMRspNAdOWSe8sl
YjDklgtFoSnN2sg00iETub2vkSKLTTnv8MhcpuVmSQgTrHS6BBrTKfOl31fF
TOT25AcLA9SvnX5N8lazqc06SKSetPTOm+Y4GWZFO4O5X/mTjt0Fq61nT6yN
RDFIJEKIa9fIufqNTI8g6ujsctu1PlmptZiprY9MPDdDVG6ci7lhdSbLqWPm
fk9JmaAxLRa0IEQ72Qukv5tyA6E5MbJ2Ft/i3YZdfsleGj/ffTtBQwLrEcNd
2BbhgOrg9VKNCu8q1Cg38nK8ckW2Ytuhbf25gWkSxk+woPlmhkBWmOWYSCvX
LVesT/VEGnorCkNPZAi23KR3Wa7BtQqAHFkjqr/EnkFzOC3PVAaeIAAn/Okf
iYaIR/Dnd/zXF1BWpvK8GezrfoyPP+/Q2y6l/RVENsj6nzNsyEb9CqOGvpiY
MpIFTAwaPbhu34qTFkrH7cPEvpHufPLi80cPTx5hFPl0Ni+Ojm/e0t5Cs8Gm
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
GsmLk0tEZv9RGipTngdO7SQHkxWTYYzaz7CtGcxpCyZ3aJePo7c3IFWd+2Sb
SAOQtbNzRMxcSjy93pA0QjPRfgdmUzKd0GAvo3Ak4yYsnokc9DC6u1yE1reY
kJMvlXUCglVfATUGMXlwATgss3xdrTDbWHV0b6FTQUiJdNDMQkVyUe6jcAqI
A22puBqnpyNqatScw57YR3eD/aQqUvtcs5nNoAdxbIolOHIun0/nC4a3rF8X
7H6mUTEFFQqGCj0spzN6xzInusfaTkrVmFZxFM5p3tABjYcmgFWDuGgeLyxD
fkXPcXBkyBvRWBDk2C7XYsxMLaWRHUUG4NTgxpda0l77sFFckjAwMEZdRDmL
bDTxuOHYqlAzIBkaKbTr68VUxJt//z9PXiSz1mCqo/u3j3EvU3CypG05RT6s
y0cb7K4hBCTDEcvFFkVq7Kkzopc0uy7UnJmyJhrKD3Ku5wKdD5fOHeCdi72X
hD8zlGMxW7NvePRVTcy18LbEqnVqQWnyO8zKzFbnsG4QEwBHprt99vdyHZQ0
vSxRSht1efc3KgaVta9KxRNBvibEZ2QjeV56l1mpD3WR3dkXRJZ5he7s72aq
+/axE2jH19fQ2QQR1DKhEyE2irWTk8pVBiKEAlVqJV+RY3S8k/dTsg5O1rd1
1S7KfWfr7v2bcrZ+UrnUtCOHBdbgQRYgAB6vFPq6Y5dbyYmARTDOTiTm0GmY
+yeO5r5TdSucqqxzqtw/dqqyPafKTdOF+sXnKts5V+5XnKtpHc5V5s+V+2ed
q2Bf/5JzJb6leDHzBRAW2/NlIyrvBqYt8dAlDPnD34fZ35tWw+IWf7814CRx
NWcHOxZfZS6rJqs/jSFAscgMS8A7HFCwOU2MxWhNXATYk2UtZbEX0nR2GKjo
a5lCVIrRbDA0nmZLVHrpfJ5yFlvfVED4NkXAuLohkBgqHtAe179AOmiKXfyI
fkW69cpJs57dRxZRjNyEhSRLM1Wag5zjBK8CzgwY4tVXJrZo7ozrdurd/aRX
bOxih50K/qbAdIP6zjdLBiVVHA7mI9UyuLtU13DnEOk+DXDCSafxMD7FR9mu
8+3zl1kf9pMS9E/27LmE971MrE5q57l7eOt+sPPIhcU5C/E63KQ6OS7K4tIC
KVU4VdlU900yCUUIY1k9SC7e1ezNObp6Hsua4YAl/YqWWlMKBA2/WurUzDGo
fkk5RIw1FjwAZjNijy464kpI2qr3SqM9CU8QXeD3CDG4eytmC9wlZ8NyeKPA
Z7DJlo02MoewXRyKGttJsEzHt3+zT82NOTAMJC5WAeJTLtIvryMPJ7r3cTxA
En8gGQRwqoNUNOuac+o0VAA3Kb5FnXCBBUBSkjOsc0Pv7lI9QgoGofQkrZUc
naTPkH7nSf9sWu0l/r9IqHBfQvy/QKjgjsF8c66tGcqmqFeBdcTLcylIK1EJ
9bUhJFr7zVcYcfYi72al/+6+Iyoq0zxlASRHsJJ6rbijJDUuE5LgFoUyDm+s
mLP7VrCLggEi2BvGZ1V1tijY12z+s5FiHQ1Ynm4r+tMEdHWMwJCQQ8EdCYbc
kIlsXAMpLWAg5PicC6dZ2IsGvLi9AS/AoylRuktSZVKTIjvVPKSTRCtEh93p
evOGMCDOgrEV4wILyG8tPMCypmGSNDbmCfMJjhQyGAHLdidhpy9euQEHs8OE
EdcoKRVbnBZPSaC635yEj3vrinbui5UJQz/nsdOoL1chNCKz+AnF31Zfq9vx
tdri+PAQI/X+kCS+L6UKeu9duPecpcAl7hKuqfVYOVgk5mRMQBda8SndM7Of
xIEscJd1rR8WKxZfZi6Aa8uEosc/nDw84IjIZMXZHaErbo76iAMd3/oN51qI
FUFwG5EjyHca3PoiX0hglyfax7e+VL4NRM4P4RcSupjEhbBwD11s+xbJoJOd
wFjru5eUF+vAmoET98UuiI4HHteRCZKUiP3rZjXzCJqJNq42tdQa1cHqEWEi
qBmCjwM2P4X7+c5vXNfJkfAq5qFhE+7As4BpM0XuyNMDlbwcHz2/9n04J/Ao
xwndpD/08cFOVJbGrtRd75lDOIYBk0kRCcl7SaxKXWk1Pke+7mz/7m8sNaG7
bl5wakoEJXTMPcL8VOAJMGkiT+cLt9eyLleCLVTpzrMb+7QoFqIexLh4fovR
TzwfXw6S021UijZJwGyvSdyDD5SjM3g1mWhg0kc+/ilgQ3K/s+h+eyEy3G4X
Al0SNSwuje5rng/sTkmaSh7H2HGUpOiHYTAcqAChtpDCdMm66ciIXl1NDmw6
oi4hiAjSshxCiQUPuaX6xUcOvtU/hunyguKmUlYI3THELzG+gRKj9pPrIrqZ
QllyPTpvnCiDzM0UD2jD1eLCRxs7sTF63/Q1ttJ+qGhx7TG02DcXwe36KCq5
/RBplKHvlnjfUzkuqulgLXWh0craYUS+ZD3jbHC6bmHlO+3VAFwSwjx97Q4u
e2aHaxjHaunJSFNMVcHPpQoFpyU267L2KfwuKtBlFffG2Ul3vogs29QMrIcF
nc8DrFw3Cq0bcf1GhHGwV2Zx6810Uc6+NI6QMz9NxfRIKq1WrjKFZsWRcny0
OSBy0Ylhi8bIsZFGJjTc2Cet/Ied4i/47z/iNJ6d34IlyX/FwrvIMLuNuf8Y
ffl/n3p2z2+fbpq6lst9dRVDu328btb87DW/MTxa+tXebNww670qSjoUznf/
aF2z/ryv66bT9zVdozXtml3avmjW1dV1cTUftWvVemNPuHStstTnuu6j7wF3
HXyCn+zXL7h2Hb2W/dquWdq5ulJL2TXbHO21erp2FzxRkz/X9W/xVDQKL/p8
diTRs/u2PRVi8RUKVL568fjhyXcnj0me/XN28uDZA3uBuv7y/z717J7f0DjL
ex256boGVpXVVN4zr7O/Z5ogb1/Fq8vddLpWi+0XdP6Zrqd1t+tPLykXXmVD
FhM8bzP0VtmZ//GjwIZ6wlxadeTignFxNeQbEUlRkJlPgE0yBl0SqumFRo6z
QuwmSwIMP42YMBJzp5IF7kFbLaCKSwRWSyf1H7SQmcaeMoo4isVH5ey7SJ+h
DJLPgBXPhnKeKJRLQ619JFdsE4r4lIb1Bs9mUiUqp1mtpd6ESn4aQmuYg9EE
DVhEQtsAT+98Pn3A8dGQC0g9bMZBL1Lry+MDMGKRCjpRwQvLqY6TRTj3R/zg
zpQUs5FGMcwVSd9zoHHQ31LyCaOVdAfOVKpD+VGdsNRyT0Xq8Zp+VJ1ZEs1n
6/lmSaoUHlrNOY5v5IPmF0ldj8YlbeEsSgxM0A+y79nilHGYTGExer7QK6PR
i3aIsiHegV1KKZ+0XrsicVW1wJREmVyqfcX1paWCGZCnFJYYkSimN0rYM++G
17l5IvpZbYmvXj3598d/Jj3ju5Mnj1G7TOvpiqYxL2b1dm0idbrUzcAvlUlL
3q4gtj6r78Un0opFD8LpkyljSw50X8OBmhaWXRfjjGkxeR8l5DFlUh+Ibg1W
MV+1GrKrwR2cez7qRJM3nbwyVD2aMqDcQsutSy+yFVbpowN6GSVMBHwYLwWb
HcjDdFtkSGXqp+RMRzRMKou90uBR2gA2hGpDmmZHtAZ+FWSjvcE5P8ZLP/c/
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
w3dKwtOZmsKgSf1f3lpZ0hU/AQA=

-->

</rfc>
