<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.17 (Ruby 3.0.2) -->
<?rfc docindent="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-quic-qlog-main-schema-03" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title>Main logging schema for qlog</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-03"/>
    <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="August" day="31"/>
    <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-02"/>
        </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-02"/>
        </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-02">
        <name>Since draft-ietf-quic-qlog-main-schema-02:</name>
        <ul spacing="normal">
          <li>No changes - new draft to prevent expiration</li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-quic-qlog-main-schema-01">
        <name>Since draft-ietf-quic-qlog-main-schema-01:</name>
        <ul spacing="normal">
          <li>Change the data definition language from TypeScript to CDDL (#143)</li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-quic-qlog-main-schema-00">
        <name>Since draft-ietf-quic-qlog-main-schema-00:</name>
        <ul spacing="normal">
          <li>Changed the streaming serialization format from NDJSON to JSON Text Sequences
(#172)</li>
          <li>Added Media Type definitions for various qlog formats (#158)</li>
          <li>Changed to semantic versioning</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-main-schema-draft-02">
        <name>Since draft-marx-qlog-main-schema-draft-02:</name>
        <ul spacing="normal">
          <li>These changes were done in preparation of the adoption of the drafts by the QUIC
working group (#137)</li>
          <li>Moved RawInfo, Importance, Generic events and Simulation events to this document.</li>
          <li>Added basic event definition guidelines</li>
          <li>Made protocol_type an array instead of a string (#146)</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-main-schema-01">
        <name>Since draft-marx-qlog-main-schema-01:</name>
        <ul spacing="normal">
          <li>
            <t>Decoupled qlog from the JSON format and described a mapping instead (#89)
            </t>
            <ul spacing="normal">
              <li>Data types are now specified in this document and proper definitions for
fields were added in this format</li>
              <li>64-bit numbers can now be either strings or numbers, with a preference for
numbers (#10)</li>
              <li>binary blobs are now logged as lowercase hex strings (#39, #36)</li>
              <li>added guidance to add length-specifiers for binary blobs (#102)</li>
            </ul>
          </li>
          <li>Removed "time_units" from Configuration. All times are now in ms instead (#95)</li>
          <li>Removed the "event_fields" setup for a more straightforward JSON format
(#101,#89)</li>
          <li>Added a streaming option using the NDJSON format (#109,#2,#106)</li>
          <li>Described optional optimization options for implementers (#30)</li>
          <li>Added QLOGDIR and QLOGFILE environment variables, clarified the .well-known URL
usage (#26,#33,#51)</li>
          <li>Overall tightened up the text and added more examples</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-main-schema-00">
        <name>Since draft-marx-qlog-main-schema-00:</name>
        <ul spacing="normal">
          <li>All field names are now lowercase (e.g., category instead of CATEGORY)</li>
          <li>Triggers are now properties on the "data" field value, instead of separate field
types (#23)</li>
          <li>group_ids in common_fields is now just also group_id</li>
        </ul>
      </section>
    </section>
    <section 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:
H4sIAAAAAAAAA+296ZYb15Um+v88RRTYXgJkADlwhlvlokhKThcnk5TUblqL
DACRmWECCDgikEk4i/U+/Q79r1+s97eHMwSQJCX73rtWratVZSKBiDOfPe9v
j0Yj15btophkT/NylS2qs7NydZY1s/NimWenVZ39jb5z82q2ypf01LzOT9tR
WbSno79tytkIv46W9OpIXhkd3nSzvC3Oqno7yZp27ly5ridZW2+a9vjw8P7h
scvrIp9kr+t81ayrunWXVf3+rK4260n2px9OHrr3xZa+mk+yk1Vb1KuiHT1C
r841bb6av80X1YpGsi0aty4n2Zu2mg0zGmC5mherdpg11GZdnDb0abvUD21d
zuinWbVc5/phSQ/TT+VqUa6Kn53LN+15VU9clo3o/zP6oZlkL8e0LvUH/kIW
4GU1pXXyX1b12ST79x+yJ8XmoljxV7QK5WKS1XhwvKQH/+39ZsE/j6cFP1FX
WPBiXrZVnfb3ZJw9K2ezisZURp0+2czyzg/c8Xf5rJhW1fu438XKnvu30+mY
JvqZLp+Os1cFvbtaRR3S/NpilfzAHb6oK1ruapE9yadN3OuSX/i3tf4+zsvd
bt2qqpd5W14UWOU/PXn+/Qj7PeEn9RT28E1W0GK12bw4pVm0ZbVq/Ens8cNz
OmGT7OrRg9ePP/IXTVGXRVOuTitpLeucnWsOLn/izpoRHUy8F44B/hvpv3uO
w7VH4ppjsWcX9vSwcwA+eQj2H4Qv66mz75/c+0/s/+4u69b+4Wa6sX94/frF
wc2MbnD2pxcPHv77/2ubfH7z/9/if/IWYw/8VXaj0SijZ9uaSKtzr8/LBuR4
s5TtbWZ1OS2aLM/Oy7Pz0YL2YhHzlzxjsp7X8/LvxdxzIOmAeMliQd9iI8dZ
xm3LLxn9UF02WZE326w5z2u8VJ3i1OR8yNrzIpsRp8HRwg91sWny6aJwF2Wz
yRfl3+UXPDovphvpta2qRTOmfoo9o6UT0CaTKxtaCVrIOY2wrbJpkRn9G+Vn
q6ppyxl2YJ3XdJT9a03WrItZebrNzqtLHqbOqDmvNou5o2Y2DbWIxZEny5lv
mOcnA7RR0dIumkob8R0PeWazfEXDcnWxrouG+qZmaRZoufiQL9eLIvvjq+fP
iB82F7T70st0czqWTV2W8zktmLuBi1ZX880MS4YtLuoCHc82dU2tLra0i4t8
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
3DoAoWgNSZyBiLPrdLFVlXOoGjTtWTFXpWoFhx5pcYnft/B8Se2m3vmbs/mi
I7tHOzCGHZbk3YX7G/OJy5LIFlMyfz9tvPyCF125HybpjewNNpflXlrJKaRc
l0438G0Qvfy9UVM/cra4HkQxCmKh8++5MANooLCoVeutNrP0bt50IRB4ASVn
GPM3DpyVU/ZafSCtrAKILOR2nve6atqR8hNWjtpirREJ3eVmWrRp/KJNK2Lf
HFTpT0HfzBqBYCiDcyKbgZDBSAl3Ir9Dsv+QqRmboeTm9owc29J7dYUp3SW2
qaS1p9WgXuYH7OmAPCBLL+YS9fQbMeyszNAoKLz0MGiunDBzokm2aboq4+xl
Lh6Ic76dCwk5mteV+A7xKN7lC6sHXq6yI5WIzZXqTFtslcmy/hGbH3jcuVre
6YTYj+kWDF2eCO3844jH7cX2a9hUkIg9pxIiuV/Y/p0wkLokkkO7+8PLE0QS
iOZ1iXiGtliuW9G0sQWZCSgqk9MiJqK7ksy3TI8m2Y/y5wv2qgYG1JmPEedo
7L9MSI+50M5sIT6z2MoSEYsTFp1gojLNAk8dNPXFgWzEQVvN8+0ByEDTjjlY
VJ9NZgjhmo86vS2UuZd9DFxoZ7KBEUVzjXgRzD5q71qJ/Re2LjalMRkyW18S
TKNXMqZuEZmBEFbDRuxD3VQQ7ZlRUZXWoQW1mPWafx+V80bDEbKTQHTlknvL
JWIw5JYLRaEpzdrINNIhE7m9r5Eii0057/DIXKblZkkIE6x0ugQa0ynzpd9X
xUzk9uQHCwPUr51+TfJWs6nNOkiknrT0zpvmOBlmRTuDuV/5k47dBautZ0+s
jUQxSCRCiGvXyLn6jUyPIOro7HLbtT5ZqbWYqa2PTDw3Q1RunIu5YXUmy6lj
5n5PSZmgMS0WtCBEO9kLpL+bcgOhOTGydhbf4t2GXX7JXho/3307QUMC6xHD
XdgW4YDq4PVSjQrvKtQoN/JyvHJFtmLboW39uYFpEsZPsKD5ZoZAVpjlmEgr
1y1XrE/1RBp6KwpDT2QIttykd1muwbUKgBxZI6q/xJ5Bczgtz1QGniAAJ/zp
H4mGiEfw53f81xdQVqbyvBns636Mjz/v0Nsupf0VRDbI+p8zbMhG/Qqjhr6Y
mDKSBUwMGj24bt+KkxZKx+3DxL6R7nzy4vNHD08eYRT5dDYvjo5v3tLeQrPB
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
zBrJi5NLRGb/URoqU54HTu0kB5MVk2GM2s+wrRnMaQsmd2iXj6O3NyBVnftk
m0gDkLWzc0TMXEo8vd6QNEIz0X4HZlMyndBgL6NwJOMmLJ6JHPQwurtchNa3
mJCTL5V1AoJVXwE1BjF5cAE4LLN8Xa0w21h1dG+hU0FIiXTQzEJFclHuo3AK
iANtqbgap6cjamrUnMOe2Ed3g/2kKlL7XLOZzaAHcWyKJThyLp9P5wuGt6xf
F+x+plExBRUKhgo9LKczescyJ7rH2k5K1ZhWcRTOad7QAY2HJoBVg7hoHi8s
Q35Fz3FwZMgb0VgQ5Ngu12LMTC2lkR1FBuDU4MaXWtJe+7BRXJIwMDBGXUQ5
i2w08bjh2KpQMyAZGim06+vFVMSbf/8/T14ks9ZgqqP7t49xL1NwsqRtOUU+
rMtHG+yuIQQkwxHLxRZFauypM6KXNLsu1JyZsiYayg9yrucCnQ+Xzh3gnYu9
l4Q/M5RjMVuzb3j0VU3MtfC2xKp1akFp8jvMysxW57BuEBMAR6a7ffb3ch2U
NL0sUUobdXn3NyoGlbWvSsUTQb4mxGdkI3leepdZqQ91kd3ZF0SWeYXu7O9m
qvv2sRNox9fX0NkEEdQyoRMhNoq1k5PKVQYihAJVaiVfkWN0vJP3U7IOTta3
ddUuyn1n6+79m3K2flK51LQjhwXW4EEWIAAerxT6umOXW8mJgEUwzk4k5tBp
mPsnjua+U3UrnKqsc6rcP3aqsj2nyk3ThfrF5yrbOVfuV5yraR3OVebPlftn
natgX/+ScyW+pXgx8wUQFtvzZSMq7wamLfHQJQz5w9+H2d+bVsPiFn+/NeAk
cTVnBzsWX2UuqyarP40hQLHIDEvAOxxQsDlNjMVoTVwE2JNlLWWxF9J0dhio
6GuZQlSK0WwwNJ5mS1R66XyechZb31RA+DZFwLi6IZAYKh7QHte/QDpoil38
iH5FuvXKSbOe3UcWUYzchIUkSzNVmoOc4wSvAs4MGOLVVya2aO6M63bq3f2k
V2zsYoedCv6mwHSD+s43SwYlVRwO5iPVMri7VNdw5xDpPg1wwkmn8TA+xUfZ
rvPt85dZH/aTEvRP9uy5hPe9TKxOaue5e3jrfrDzyIXFOQvxOtykOjkuyuLS
AilVOFXZVPdNMglFCGNZPUgu3tXszTm6eh7LmuGAJf2KllpTCgQNv1rq1Mwx
qH5JOUSMNRY8AGYzYo8uOuJKSNqq90qjPQlPEF3g9wgxuHsrZgvcJWfDcnij
wGewyZaNNjKHsF0cihrbSbBMx7d/s0/NjTkwDCQuVgHiUy7SL68jDye693E8
QBJ/IBkEcKqDVDTrmnPqNFQANym+RZ1wgQVAUpIzrHND7+5SPUIKBqH0JK2V
HJ2kz5B+50n/bFrtJf6/SKhwX0L8v0Co4I7BfHOurRnKpqhXgXXEy3MpSCtR
CfW1ISRa+81XGHH2Iu9mpf/uviMqKtM8ZQEkR7CSeq24oyQ1LhOS4BaFMg5v
rJiz+1awi4IBItgbxmdVdbYo2Nds/rORYh0NWJ5uK/rTBHR1jMCQkEPBHQmG
3JCJbFwDKS1gIOT4nAunWdiLBry4vQEvwKMpUbpLUmVSkyI71Tykk0QrRIfd
6XrzhjAgzoKxFeMCC8hvLTzAsqZhkjQ25gnzCY4UMhgBy3YnYacvXrkBB7PD
hBHXKCkVW5wWT0mgut+chI9764p27ouVCUM/57HTqC9XITQis/gJxd9WX6vb
8bXa4vjwECP1/pAkvi+lCnrvXbj3nKXAJe4Srqn1WDlYJOZkTEAXWvEp3TOz
n8SBLHCXda0fFisWX2YugGvLhKLHP5w8POCIyGTF2R2hK26O+ogDHd/6Deda
iBVBcBuRI8h3Gtz6Il9IYJcn2se3vlS+DUTOD+EXErqYxIWwcA9dbPsWyaCT
ncBY67uXlBfrwJqBE/fFLoiOBx7XkQmSlIj962Y18wiaiTauNrXUGtXB6hFh
IqgZgo8DNj+F+/nOb1zXyZHwKuahYRPuwLOAaTNF7sjTA5W8HB89v/Z9OCfw
KMcJ3aQ/9PHBTlSWxq7UXe+ZQziGAZNJEQnJe0msSl1pNT5Hvu5s/+5vLDWh
u25ecGpKBCV0zD3C/FTgCTBpIk/nC7fXsi5Xgi1U6c6zG/u0KBaiHsS4eH6L
0U88H18OktNtVIo2ScBsr0ncgw+UozN4NZloYNJHPv4pYENyv7PofnshMtxu
FwJdEjUsLo3ua54P7E5Jmkoex9hxlKToh2EwHKgAobaQwnTJuunIiF5dTQ5s
OqIuIYgI0rIcQokFD7ml+sVHDr7VP4bp8oLiplJWCN0xxC8xvoESo/aT6yK6
mUJZcj06b5wog8zNFA9ow9XiwkcbO7Exet/0NbbSfqhoce0xtNg3F8Ht+igq
uf0QaZSh75Z431M5LqrpYC11odHK2mFEvmQ942xwum5h5Tvt1QBcEsI8fe0O
Lntmh2sYx2rpyUhTTFXBz6UKBaclNuuy9in8LirQZRX3xtlJd76ILNvUDKyH
BZ3PA6xcNwqtG3H9RoRxsFdmcevNdFHOvjSOkDM/TcX0SCqtVq4yhWbFkXJ8
tDkgctGJYYvGyLGRRiY03NgnrfyHneIv+O8/4jSend+CJcl/xcK7yDC7jbn/
GH35f596ds9vn26aupbLfXUVQ7t9vG7W/Ow1vzE8WvrV3mzcMOu9Kko6FM53
/2hds/68r+um0/c1XaM17Zpd2r5o1tXVdXE1H7Vr1XpjT7h0rbLU57ruo+8B
dx18gp/s1y+4dh29lv3arlnaubpSS9k12xzttXq6dhc8UZM/1/Vv8VQ0Ci/6
fHYk0bP7tj0VYvEVClS+evH44cl3J49Jnv1zdvLg2QN7gbr+8v8+9eye39A4
y3sduem6BlaV1VTeM6+zv2eaIG9fxavL3XS6VovtF3T+ma6ndbfrTy8pF15l
QxYTPG8z9FbZmf/xo8CGesJcWnXk4oJxcTXkGxFJUZCZT4BNMgZdEqrphUaO
s0LsJksCDD+NmDASc6eSBe5BWy2giksEVksn9R+0kJnGnjKKOIrFR+Xsu0if
oQySz4AVz4ZyniiUS0OtfSRXbBOK+JSG9QbPZlIlKqdZraXehEp+GkJrmIPR
BA1YRELbAE/vfD59wPHRkAtIPWzGQS9S68vjAzBikQo6UcELy6mOk0U490f8
4M6UFLORRjHMFUnfc6Bx0N9S8gmjlXQHzlSqQ/lRnbDUck9F6vGaflSdWRLN
Z+v5ZkmqFB5azTmOb+SD5hdJXY/GJW3hLEoMTNAPsu/Z4pRxmExhMXq+0Cuj
0Yt2iLIh3oFdSimftF67InFVtcCURJlcqn3F9aWlghmQpxSWGJEopjdK2DPv
hte5eSL6WW2Jr149+ffHfyY947uTJ49Ru0zr6YqmMS9m9XZtInW61M3AL5VJ
S96uILY+q+/FJ9KKRQ/C6ZMpY0sOdF/DgZoWll0X44xpMXkfJeQxZVIfiG4N
VjFftRqyq8EdnHs+6kSTN528MlQ9mjKg3ELLrUsvshVW6aMDehklTAR8GC8F
mx3Iw3RbZEhl6qfkTEc0TCqLvdLgUdoANoRqQ5pmR7QGfhVko73BOT/GSz/3
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
dD8BAA==

-->

</rfc>
