<?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-09" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title abbrev="qlog">qlog: Structured Logging for Network Protocols</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-09"/>
    <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
      <organization>Akamai</organization>
      <address>
        <email>rmarx@akamai.com</email>
      </address>
    </author>
    <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
      <organization>Meta</organization>
      <address>
        <email>lniccolini@meta.com</email>
      </address>
    </author>
    <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
      <organization/>
      <address>
        <email>martenseemann@gmail.com</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue" role="editor">
      <organization>Cloudflare</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date year="2024" month="July" day="08"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>qlog provides extensible structured logging for network protocols, allowing for
easy sharing of data that benefits common debug and analysis methods and
tooling. This document describes key concepts of qlog: formats, files, traces,
events, and extension points. This definition includes the high-level log file
schemas, and generic event schemas. Requirements and guidelines for creating
protocol-specific event schemas are also presented. All schemas are defined
independent of serialization format, allowing logs to be represented in various
ways such as JSON, CSV, or protobuf.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <ul empty="true">
        <li>
          <t>Note to RFC editor: Please remove this section before publication.</t>
        </li>
      </ul>
      <t>Feedback and discussion are welcome at
<eref target="https://github.com/quicwg/qlog">https://github.com/quicwg/qlog</eref>. Readers are
advised to refer to the "editor's draft" at that URL for an up-to-date version
of this document.</t>
      <t>Concrete examples of integrations of this schema in
various programming languages can be found at
<eref target="https://github.com/quiclog/qlog/">https://github.com/quiclog/qlog/</eref>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Endpoint logging is a useful strategy for capturing and understanding how
applications using network protocols are behaving, particularly where protocols
have an encrypted wire image that restricts observers' ability to see what is
happening.</t>
      <t>Many applications implement logging using a custom, non-standard logging format.
This has an effect on the tools and methods that are used to
analyze the logs, for example to perform root cause analysis of an
interoperability failure between distinct implementations. A lack of a common
format impedes the development of common tooling that can be used by all parties
that have access to logs.</t>
      <t>qlog is an extensible structured logging for network protocols that allows for
easy sharing of data that benefits common debug and analysis methods and
tooling. This document describes key concepts of qlog: formats, files, traces,
events, and extension points. This definition includes the high-level log file
schemas, and generic event schemas. Requirements and guidelines for creating
protocol-specific event schemas are also presented. Accompanying documents
define event schema for QUIC (<xref target="QLOG-QUIC"/>) and HTTP/3 (<xref target="QLOG-H3"/>).</t>
      <t>The goal of qlog is to provide amenities and default characteristics that each
logging file should contain (or should be able to contain), such that generic
and reusable toolsets can be created that can deal with logs from a variety of
different protocols and use cases.</t>
      <t>As such, qlog provides versioning, metadata inclusion, log aggregation, event
grouping and log file size reduction techniques.</t>
      <t>All qlog schemas can be serialized in many ways (e.g., JSON, CBOR, protobuf,
etc). This document describes only how to employ <xref target="JSON"/>, its subset
<xref target="I-JSON"/>, and its streamable derivative
<xref target="JSON-Text-Sequences"/>.</t>
      <section anchor="conventions-and-terminology">
        <name>Conventions and Terminology</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t>Serialization examples in this document use JSON (<xref target="JSON"/>) unless
otherwise indicated.</t>
      </section>
      <section anchor="use-of-cddl">
        <name>Use of CDDL</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> and <tt>$$</tt> extension points syntax from <xref target="CDDL"/>.</t>
        <t>Additionally, this document defines the following custom types for
clarity:</t>
        <figure anchor="cddl-custom-types-def">
          <name>Additional CDDL type definitions</name>
          <sourcecode type="cddl"><![CDATA[
; CDDL's uint is defined as being 64-bit in size
; but for many protocol fields it is better to be restrictive
; and explicit
uint8 = uint .size 1
uint16 = uint .size 2
uint32 = uint .size 4
uint64 = uint .size 8

; an even-length lowercase string of hexadecimally encoded bytes
; examples: 82dc, 027339, 4cdbfd9bf0
; this is needed because the default CDDL binary string (bytes/bstr)
; is only CBOR and not JSON compatible
hexstring = text .regexp "([0-9a-f]{2})*"
]]></sourcecode>
        </figure>
        <t>All timestamps and time-related values (e.g., offsets) in qlog are
logged as <tt>float64</tt> in the millisecond resolution.</t>
        <t>Other qlog documents can define their own CDDL-compatible (struct) types
(e.g., separately for each Packet type that a protocol supports).</t>
        <t>The ordering of member fields in qlog CDDL type definitions is not significant.
The ordering of member fields in the serialization formats defined in this
document, JSON (<xref target="format-json"/>) and JSON Text Sequences (<xref target="format-json-seq"/>),
is not significant and qlog tools <bcp14>MUST NOT</bcp14> assume so. Other qlog serialization
formats <bcp14>MAY</bcp14> define field order significance, if they do they <bcp14>MUST</bcp14> define
requirements for qlog tools supporting those formats.</t>
        <ul empty="true">
          <li>
            <t>Note to RFC editor: Please remove the following text in this section before
publication.</t>
          </li>
        </ul>
        <t>The main general CDDL syntax conventions in this document a reader
should be aware of for easy reading comprehension are:</t>
        <ul spacing="normal">
          <li>
            <tt>? obj</tt> : this object is optional</li>
          <li>
            <tt>TypeName1 / TypeName2</tt> : a union of these two types (object can be either type 1 OR
type 2)</li>
          <li>
            <tt>obj: TypeName</tt> : this object has this concrete type</li>
          <li>
            <tt>obj: [* TypeName]</tt> : this object is an array of this type with
minimum size of 0 elements</li>
          <li>
            <tt>obj: [+ TypeName]</tt> : this object is an array of this type with
minimum size of 1 element</li>
          <li>
            <tt>TypeName = ...</tt> : defines a new type</li>
          <li>
            <tt>EnumName = "entry1" / "entry2" / entry3 / ...</tt>: defines an enum</li>
          <li>
            <tt>StructName = { ... }</tt> : defines a new struct type</li>
          <li>
            <tt>;</tt> : single-line comment</li>
          <li>
            <tt>* text =&gt; any</tt> : special syntax to indicate 0 or more fields that
have a string key that maps to any value. Used to indicate a generic
JSON object.</li>
        </ul>
        <t>All timestamps and time-related values (e.g., offsets) in qlog are
logged as <tt>float64</tt> in the millisecond resolution.</t>
        <t>Other qlog documents can define their own CDDL-compatible (struct) types
(e.g., separately for each Packet type that a protocol supports).</t>
      </section>
    </section>
    <section anchor="design-overview">
      <name>Design Overview</name>
      <t>The main tenets for the qlog design are:</t>
      <ul spacing="normal">
        <li>Streamable, event-based logging</li>
        <li>A flexible format that can reduce log producer overhead, at the cost of
increased complexity for consumers (e.g. tools)</li>
        <li>Extensible and pragmatic</li>
        <li>Aggregation and transformation friendly (e.g., the top-level element
for the non-streaming format is a container for individual traces,
group_ids can be used to tag events to a particular context)</li>
        <li>Metadata is stored together with event data</li>
      </ul>
      <t>This is achieved by a logical logging hierarchy of:</t>
      <ul spacing="normal">
        <li>
          <t>Log file
          </t>
          <ul spacing="normal">
            <li>
              <t>Trace(s)
              </t>
              <ul spacing="normal">
                <li>Event(s)</li>
              </ul>
            </li>
          </ul>
        </li>
      </ul>
      <t>An abstract LogFile class is declared (<xref target="abstract-logfile"/>), from which all
concrete log file formats derive using log file schemas. This document defines
the QLogFile (<xref target="qlog-file-schema"/>) and QLogFileSeq (<xref target="qlog-file-seq-schema"/>)
log file schemas.</t>
      <t>A trace is conceptually fluid but the conventional use case is to group events
related to a single data flow, such as a single logical QUIC connection, at a
single vantage point (<xref target="vantage-point"/>). Concrete trace definitions relate to
the log file schemas they are contained in; see (<xref target="traces"/>, <xref target="trace"/>, and
<xref target="traceseq"/>).</t>
      <t>Events are logged at a time instant and convey specific details of the logging
use case. For example, a network packet being sent or received. This document
declares an abstract Event class (<xref target="abstract-event"/>) containing common fields,
which all concrete events derive from. Concrete events are defined by event
schemas that declare a namespace, consisting of one or more categories,
containing one or more related event types. For example, this document defines
the generic event schema structured as:</t>
      <ul spacing="normal">
        <li>
          <t><tt>gen</tt> namespace
          </t>
          <ul spacing="normal">
            <li>
              <t><tt>loglevel</tt> category
              </t>
              <ul spacing="normal">
                <li>
                  <tt>error</tt> event type</li>
                <li>
                  <tt>warning</tt> event type</li>
                <li>
                  <tt>info</tt> event type</li>
                <li>
                  <tt>debug</tt> event type</li>
                <li>
                  <tt>verbose</tt> event type</li>
              </ul>
            </li>
            <li>
              <t><tt>sim</tt> category
              </t>
              <ul spacing="normal">
                <li>
                  <tt>scenario</tt> event type</li>
                <li>
                  <tt>marker</tt> event type</li>
              </ul>
            </li>
          </ul>
        </li>
      </ul>
    </section>
    <section anchor="abstract-logfile">
      <name>Abstract LogFile Class</name>
      <t>A Log file is intended to contain a collection of events that are in some way
related. An abstract LogFile class containing fields common to all log files is
defined in <xref target="abstract-logfile-def"/>. Each concrete log file schema derives from
this using the CDDL unwrap operator (~) and can extend it by defining semantics
and any custom fields.</t>
      <figure anchor="abstract-logfile-def">
        <name>LogFile definition</name>
        <sourcecode type="cddl"><![CDATA[
LogFile = {
    file_schema: text
    serialization_format: text
    ? title: text
    ? description: text
    event_schemas: [+text]
}
]]></sourcecode>
      </figure>
      <t>The required "file_schema" field identifies the concrete log file schema. It
<bcp14>MUST</bcp14> have a value that is an absolute URI; see <xref target="schema-uri"/> for rules and
guidance.</t>
      <t>The required "serialization_format" field indicates the serialization
format using a media type <xref target="RFC2046"/>. It is case-insensitive.</t>
      <t>In order to make it easier to parse and identify qlog files and their
serialization format, the "file_schema" and "serialization_format" fields and
their values <bcp14>SHOULD</bcp14> be in the first 256 characters/bytes of the resulting log
file.</t>
      <t>The optional "title" and "description" fields provide additional free-text
information about the file.</t>
      <t>The required "event_schemas" field contains event schema URIs that identify
concrete event categories and their associated types recorded in a log.
Requirements and guidelines are defined in <xref target="event-types-and-schema"/>.</t>
      <section anchor="schema-uri">
        <name>Concrete Log File Schema URIs</name>
        <t>Concrete log file schemas <bcp14>MUST</bcp14> identify themselves using a URI <xref target="RFC3986"/>.</t>
        <t>Log file schemas defined by RFCs <bcp14>MUST</bcp14> register a URI in the "qlog log file
schema URIs" registry and <bcp14>SHOULD</bcp14> use a URN of the form
<tt>urn:ietf:params:qlog:file:&lt;schema-identifier&gt;</tt>, where <tt>&lt;schema-identifier&gt;</tt> is
a globally-unique text name using only characters in the URI unreserved range;
see <xref section="2.3" sectionFormat="of" target="RFC3986"/>. This document registers
<tt>urn:ietf:params:qlog:file:contained</tt> (<xref target="qlog-file-schema"/>) and
<tt>urn:ietf:params:qlog:file:sequential</tt> (<xref target="qlog-file-seq-schema"/>).</t>
        <t>Private or non-standard log file schemas <bcp14>MAY</bcp14> register a URI in the "qlog log
file schema URIs" registry but <bcp14>MUST NOT</bcp14> use a URN of the form
<tt>urn:ietf:params:qlog:file:&lt;schema-identifier&gt;</tt>. URIs that contain a domain name
<bcp14>SHOULD</bcp14> also contain a month-date in the form mmyyyy. For example,
"https://example.org/072024/globallyuniquelogfileschema". The definition of the
log file schema and assignment of the URI <bcp14>MUST</bcp14> have been authorized by the owner
of the domain name on or very close to that date. This avoids problems when
domain names change ownership. The URI does not need to be dereferencable,
allowing for confidential use or to cover the case where the log file schema
continues to be used after the organization that defined them ceases to exist.</t>
        <t>The "qlog log file schema URIs" registry operates under the Expert Review
policy, per <xref section="4.5" sectionFormat="of" target="RFC8126"/>.  When reviewing requests, the expert
<bcp14>MUST</bcp14> check that the URI is appropriate to the concrete log file schema and
satisfies the requirements in this section. A request to register a private or
non-standard log file schema URI using a URN of the form
<tt>urn:ietf:params:qlog:file:&lt;schema-identifier&gt;</tt> <bcp14>MUST</bcp14> be rejected.</t>
        <t>Registration requests should use the following template:</t>
        <dl>
          <dt>Log File Schema URI:</dt>
          <dd>
            <t>[the log file schema identifier]</t>
          </dd>
          <dt>Description:</dt>
          <dd>
            <t>[a description of the log file schema]</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>[to a specification defining the log file schema]</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="qlog-file-schema">
      <name>QlogFile schema</name>
      <t>A qlog file using the QlogFile schema can contain several individual traces and
logs from multiple vantage points that are in some way related. The top-level
element in this schema defines only a small set of "header" fields and an array
of component traces. This is defined in <xref target="qlog-file-def"/> as:</t>
      <figure anchor="qlog-file-def">
        <name>QlogFile definition</name>
        <sourcecode type="cddl"><![CDATA[
QlogFile = {
    ~LogFile
    ? traces: [+ Trace /
                TraceError]
}
]]></sourcecode>
      </figure>
      <t>The QlogFile schema URI is <tt>urn:ietf:params:qlog:file:contained</tt>.</t>
      <t>QlogFile extends LogFile using the CDDL unwrap operator (~), which copies the
fields presented in <xref target="abstract-logfile"/>. Additionally, the optional "traces"
field contains an array of qlog traces (<xref target="trace"/>), each of which contain
metadata and an array of qlog events (<xref target="abstract-event"/>).</t>
      <t>The default serialization format for QlogFile is JSON; see <xref target="format-json"/> for
guidance on populating the "serialization_format" field and other
considerations. Where a qlog file is serialized to a JSON format, one of the
downsides is that it is inherently a non-streamable format. Put differently, it
is not possible to simply append new qlog events to a log file without "closing"
this file at the end by appending "]}]}". Without these closing tags, most JSON
parsers will be unable to parse the file entirely. The alternative QlogFileSeq
(<xref target="qlog-file-seq-schema"/>) is better suited to streaming use cases.</t>
      <t>JSON serialization example:</t>
      <figure anchor="qlog-file-ex">
        <name>QlogFile example</name>
        <artwork><![CDATA[
{
    "file_schema": "urn:ietf:params:qlog:file:contained",
    "serialization_format": "application/qlog+json",
    "title": "Name of this particular qlog file (short)",
    "description": "Description for this group of traces (long)",
    "traces": [...]
}
]]></artwork>
      </figure>
      <section anchor="traces">
        <name>Traces</name>
        <t>It can be advantageous to group several related qlog traces together in a single
file. For example, it is possible to simultaneously perform logging on the
client, on the server, and on a single point on their common network path. For
analysis, it is useful to aggregate these three individual traces together into
a single file, so it can be uniquely stored, transferred, and annotated.</t>
        <t>The QlogFile "traces" field is an array that contains a list of individual qlog
traces. When capturing a qlog at a vantage point, it is expected that the traces
field contains a single entry. Files can be aggregated, for example as part of a
post-processing operation, by copying the traces in component to files into the
combined "traces" array of a new, aggregated qlog file.</t>
      </section>
      <section anchor="trace">
        <name>Trace</name>
        <t>The exact conceptual definition of a Trace can be fluid. For example, a trace
could contain all events for a single connection, for a single endpoint, for a
single measurement interval, for a single protocol, etc. In the normal use case
however, a trace is a log of a single data flow collected at a single location
or vantage point. For example, for QUIC, a single trace only contains events for
a single logical QUIC connection for either the client or the server.</t>
        <t>A Trace contains some metadata in addition to qlog events, defined in
<xref target="trace-def"/> as:</t>
        <figure anchor="trace-def">
          <name>Trace definition</name>
          <sourcecode type="cddl"><![CDATA[
Trace = {
    ? title: text
    ? description: text
    ? common_fields: CommonFields
    ? vantage_point: VantagePoint
    events: [* Event]
}
]]></sourcecode>
        </figure>
        <t>The optional "title" and "description" fields provide additional free-text
information about the trace.</t>
        <t>The optional "common_fields" field is described in <xref target="common-fields"/>.</t>
        <t>The optional "vantage_point" field is described in <xref target="vantage-point"/>.</t>
        <t>The semantics and context of the trace can mainly be deduced from the entries in
the "common_fields" list and "vantage_point" field.</t>
        <t>JSON serialization example:</t>
        <figure anchor="trace-ex">
          <name>Trace example</name>
          <artwork><![CDATA[
{
    "title": "Name of this particular trace (short)",
    "description": "Description for this trace (long)",
    "common_fields": {
        "ODCID": "abcde1234",
        "time_format": "absolute"
    },
    "vantage_point": {
        "name": "backend-67",
        "type": "server"
    },
    "events": [...]
}
]]></artwork>
        </figure>
      </section>
      <section anchor="traceerror">
        <name>TraceError</name>
        <t>A TraceError indicates that an attempt to find/convert a file for inclusion in
the aggregated qlog was made, but there was an error during the process. Rather
than silently dropping the erroneous file, it can be explicitly included in the
qlog file as an entry in the "traces" array, defined in <xref target="trace-error-def"/> as:</t>
        <figure anchor="trace-error-def">
          <name>TraceError definition</name>
          <sourcecode type="cddl"><![CDATA[
TraceError = {
    error_description: text

    ; the original URI used for attempted find of the file
    ? uri: text
    ? vantage_point: VantagePoint
}
]]></sourcecode>
        </figure>
        <t>JSON serialization example:</t>
        <figure anchor="trace-error-ex">
          <name>TraceError example</name>
          <artwork><![CDATA[
{
    "error_description": "File could not be found",
    "uri": "/srv/traces/today/latest.qlog",
    "vantage_point": { type: "server" }
}
]]></artwork>
        </figure>
        <t>Note that another way to combine events of different traces in a single qlog file
is through the use of the "group_id" field, discussed in <xref target="group-ids"/>.</t>
      </section>
    </section>
    <section anchor="qlog-file-seq-schema">
      <name>QlogFileSeq schema</name>
      <t>A qlog file using the QlogFileSeq schema can be serialized to a streamable JSON
format called JSON Text Sequences (JSON-SEQ) (<xref target="RFC7464"/>). The top-level
element in this schema defines only a small set of "header" fields and an array
of component traces. This is defined in <xref target="qlog-file-def"/> as:</t>
      <figure anchor="qlog-file-seq-def">
        <name>QlogFileSeq definition</name>
        <sourcecode type="cddl"><![CDATA[
QlogFileSeq = {
    ~LogFile
    trace: TraceSeq
}
]]></sourcecode>
      </figure>
      <t>The QlogFileSeq schema URI is <tt>urn:ietf:params:qlog:file:sequential</tt>.</t>
      <t>QlogFile extends LogFile using the CDDL unwrap operator (~), which copies the
fields presented in <xref target="abstract-logfile"/>. Additionally, the required "trace"
field contains a singular trace (<xref target="trace"/>). All qlog events in the file are
related to this trace; see <xref target="traceseq"/>.</t>
      <t>See <xref target="format-json-seq"/> for guidance on populating the "serialization_format"
field and other serialization considerations.</t>
      <t>JSON-SEQ serialization example:</t>
      <figure anchor="json-seq-ex">
        <name>Top-level element</name>
        <artwork><![CDATA[
// list of qlog events, serialized in accordance with RFC 7464,
// starting with a Record Separator character and ending with a
// newline.
// For display purposes, Record Separators are rendered as <RS>

<RS>{
    "file_schema": "urn:ietf:params:qlog:file:sequential",
    "serialization_format": "application/qlog+json-seq",
    "title": "Name of JSON Text Sequence qlog file (short)",
    "description": "Description for this trace file (long)",
    "trace": {
      "common_fields": {
        "protocol_type": ["QUIC","HTTP3"],
        "group_id":"127ecc830d98f9d54a42c4f0842aa87e181a",
        "time_format":"relative",
        "reference_time": 1553986553572
      },
      "vantage_point": {
        "name":"backend-67",
        "type":"server"
      }
    }
}
<RS>{"time": 2, "name": "quic:parameters_set", "data": { ... } }
<RS>{"time": 7, "name": "quic:packet_sent", "data": { ... } }
...
]]></artwork>
      </figure>
      <section anchor="traceseq">
        <name>TraceSeq</name>
        <t>TraceSeq is used with QlogFileSeq. It is conceptually similar to a Trace, with
the exception that qlog events are not contained within it, but rather appended
after it in a QlogFileSeq.</t>
        <figure anchor="trace-seq-def">
          <name>TraceSeq definition</name>
          <sourcecode type="cddl"><![CDATA[
TraceSeq = {
    ? title: text
    ? description: text
    ? common_fields: CommonFields
    ? vantage_point: VantagePoint
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="vantage-point">
      <name>VantagePoint</name>
      <t>A VantagePoint describes the vantage point from which a trace originates,
defined in <xref target="vantage-point-def"/> as:</t>
      <figure anchor="vantage-point-def">
        <name>VantagePoint definition</name>
        <sourcecode type="cddl"><![CDATA[
VantagePoint = {
    ? name: text
    type: VantagePointType
    ? flow: VantagePointType
}

; client = endpoint which initiates the connection
; server = endpoint which accepts the connection
; network = observer in between client and server
VantagePointType = "client" /
                   "server" /
                   "network" /
                   "unknown"
]]></sourcecode>
      </figure>
      <t>JSON serialization examples:</t>
      <figure anchor="vantage-point-ex">
        <name>VantagePoint example</name>
        <artwork><![CDATA[
{
    "name": "aioquic client",
    "type": "client"
}

{
    "name": "wireshark trace",
    "type": "network",
    "flow": "client"
}
]]></artwork>
      </figure>
      <t>The flow field is only required if the type is "network" (for example, the trace
is generated from a packet capture). It is used to disambiguate events like
"packet sent" and "packet received". This is indicated explicitly because for
multiple reasons (e.g., privacy) data from which the flow direction can be
otherwise inferred (e.g., IP addresses) might not be present in the logs.</t>
      <t>Meaning of the different values for the flow field:
  * "client" indicates that this vantage point follows client data flow semantics (a
    "packet sent" event goes in the direction of the server).
  * "server" indicates that this vantage point follow server data flow semantics (a
    "packet sent" event goes in the direction of the client).
  * "unknown" indicates that the flow's direction is unknown.</t>
      <t>Depending on the context, tools confronted with "unknown" values in the
vantage_point can either try to heuristically infer the semantics from
protocol-level domain knowledge (e.g., in QUIC, the client always sends the first
packet) or give the user the option to switch between client and server
perspectives manually.</t>
    </section>
    <section anchor="abstract-event">
      <name>Abstract Event Class</name>
      <t>Events are logged at a time instant and convey specific details of the logging
use case. An abstract Event class containing fields common to all events is
defined in <xref target="event-def"/>.</t>
      <figure anchor="event-def">
        <name>Event definition</name>
        <sourcecode type="cddl"><![CDATA[
Event = {
    time: float64
    name: text
    data: $ProtocolEventData
    ? path: PathID
    ? time_format: TimeFormat
    ? protocol_type: ProtocolTypeList
    ? group_id: GroupID
    ? system_info: SystemInformation

    ; events can contain any amount of custom fields
    * text => any
}
]]></sourcecode>
      </figure>
      <t>Each qlog event <bcp14>MUST</bcp14> contain the mandatory fields: "time"
(<xref target="time-based-fields"/>), "name" (<xref target="event-types-and-schema"/>), and "data" (<xref target="data-field"/>).</t>
      <t>Each qlog event is an instance of a concrete event type that derives from the
abstract Event class; see <xref target="event-types-and-schema"/>. They extend it by defining
the specific values and semantics of common fields, in particular the <tt>name</tt> and
<tt>data</tt> fields. Furthermore, they can optionally add custom fields.</t>
      <t>Each qlog event <bcp14>MAY</bcp14> contain the optional fields: "time_format"
(<xref target="time-based-fields"/>), "protocol_type" (<xref target="protocol-type-field"/>), "trigger"
(<xref target="trigger-field"/>), and "group_id" (<xref target="group-ids"/>).</t>
      <t>Multiple events can appear in a Trace or TraceSeq and they might contain fields
with identical values. It is possible to optimize out this duplication using
"common_fields" (<xref target="common-fields"/>).</t>
      <t>Example qlog event:</t>
      <figure anchor="event-ex">
        <name>Event example</name>
        <artwork><![CDATA[
{
    "time": 1553986553572,

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

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

    "time_format": "absolute",

    "ODCID": "127ecc830d98f9d54a42c4f0842aa87e181a"
}
]]></artwork>
      </figure>
      <section anchor="time-based-fields">
        <name>Timestamps</name>
        <t>An event's "time" field indicates the timestamp at which the event occurred. Its value is
typically the Unix timestamp since the 1970 epoch (number of milliseconds since
midnight UTC, January 1, 1970, ignoring leap seconds). However, qlog supports two
more succinct timestamps formats to allow reducing file size. The employed format
is indicated in the "time_format" field, which allows one of three values:
"absolute", "delta" or "relative".</t>
        <figure anchor="time-format-def">
          <name>TimeFormat definition</name>
          <sourcecode type="cddl"><![CDATA[
TimeFormat = "absolute" /
             "delta" /
             "relative"
]]></sourcecode>
        </figure>
        <ul spacing="normal">
          <li>Absolute: Include the full absolute timestamp with each event. This approach
uses the largest amount of characters. This is also the default value of the
"time_format" field.</li>
          <li>Delta: Delta-encode each time value on the previously logged value. The first
event in a trace typically logs the full absolute timestamp. This approach uses
the least amount of characters.</li>
          <li>Relative: Specify a full "reference_time" timestamp (typically this is done
up-front in "common_fields", see <xref target="common-fields"/>) and include only
relatively-encoded values based on this reference_time with each event. The
"reference_time" value is typically the first absolute timestamp. This approach
uses a medium amount of characters.</li>
        </ul>
        <t>The first option is good for stateless loggers, the second and third for stateful
loggers. The third option is generally preferred, since it produces smaller files
while being easier to reason about. An example for each option can be seen in
<xref target="time-format-ex"/>.</t>
        <figure anchor="time-format-ex">
          <name>Three different approaches for logging timestamps</name>
          <artwork><![CDATA[
The absolute approach will use:
1500, 1505, 1522, 1588

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

The relative approach will:
- set the reference_time to 1500 in "common_fields"
- use: 0, 5, 22, 88
]]></artwork>
        </figure>
        <t>One of these options is typically chosen for the entire trace (put differently:
each event has the same value for the "time_format" field). Each event <bcp14>MUST</bcp14>
include a timestamp in the "time" field.</t>
        <t>Events in each individual trace <bcp14>SHOULD</bcp14> be logged in strictly ascending timestamp
order (though not necessarily absolute value, for the "delta" format). Tools <bcp14>MAY</bcp14>
sort all events on the timestamp before processing them, though are not required
to (as this could impose a significant processing overhead). This can be a problem
especially for multi-threaded and/or streaming loggers, who could consider using a
separate post-processor to order qlog events in time if a tool do not provide this
feature.</t>
        <t>Timestamps do not have to use the UNIX epoch timestamp as their reference. For
example for privacy considerations, any initial reference timestamps (for example
"endpoint uptime in ms" or "time since connection start in ms") can be chosen.
Tools <bcp14>SHOULD NOT</bcp14> assume the ability to derive the absolute Unix timestamp from
qlog traces, nor allow on them to relatively order events across two or more
separate traces (in this case, clock drift should also be taken into account).</t>
      </section>
      <section anchor="path-field">
        <name>Path</name>
        <t>A qlog event can be associated with a single "network path" (usually, but not
always, identified by a 4-tuple of IP addresses and ports). In many cases, the
path will be the same for all events in a given trace, and does not need to be
logged explicitly with each event. In this case, the "path" field can be omitted
(in which case the default value of "" is assumed) or reflected in
"common_fields" instead (see <xref target="common-fields"/>).</t>
        <t>However, in some situations, such as during QUIC's Connection Migration or when
using Multipath features, it is useful to be able to split events across
multiple (concurrent) paths.</t>
        <t>Definition:</t>
        <figure anchor="path-def">
          <name>PathID definition</name>
          <sourcecode type="cddl"><![CDATA[
PathID = text .default ""
]]></sourcecode>
        </figure>
        <t>The "path" field is an identifier that is associated with a single network path.
This document intentionally does not define further how to choose this
identifier's value per-path or how to potentially log other parameters that can
be associated with such a path. This is left for other documents. Implementers
are free to encode path information directly into the PathID or to log
associated info in a separate event. For example, QUIC has the "path_assigned"
event to couple the PathID value to a specific path configuration, see
<xref target="QLOG-QUIC"/>.</t>
      </section>
      <section anchor="protocol-type-field">
        <name>ProtocolTypeList and ProtocolType</name>
        <t>An event's "protocol_type" array field indicates to which protocols (or protocol
"stacks") this event belongs. This allows a single qlog file to aggregate traces
of different protocols (e.g., a web server offering both TCP+HTTP/2 and
QUIC+HTTP/3 connections).</t>
        <figure anchor="protocol-type-def">
          <name>ProtocolTypeList and ProtocolType socket definition</name>
          <sourcecode type="cddl"><![CDATA[
ProtocolTypeList = [+ $ProtocolType]

$ProtocolType /= "UNKNOWN"
]]></sourcecode>
        </figure>
        <t>For example, QUIC and HTTP/3 events have the "QUIC" and "HTTP3" protocol_type
entry values, see <xref target="QLOG-QUIC"/> and <xref target="QLOG-H3"/>.</t>
        <t>Typically however, all events in a single trace are of the same few protocols, and
this array field is logged once in "common_fields", see <xref target="common-fields"/>.</t>
      </section>
      <section anchor="trigger-field">
        <name>Triggers</name>
        <t>Sometimes, additional information is needed in the case where a single event can
be caused by a variety of other events. In the normal case, the context of the
surrounding log messages gives a hint as to which of these other events was the
cause. However, in highly-parallel and optimized implementations, corresponding
log messages might separated in time. Another option is to explicitly indicate
these "triggers" in a high-level way per-event to get more fine-grained
information without much additional overhead.</t>
        <t>In qlog, the optional "trigger" field contains a string value describing
the reason (if any) for this event instance occurring, see
<xref target="data-field"/>. While this "trigger" field could be a property of the
qlog Event itself, it is instead a property of the "data" field instead.
This choice was made because many event types do not include a trigger
value, and having the field at the Event-level would cause overhead in
some serializations. Additional information on the trigger can be added
in the form of additional member fields of the "data" field value, yet
this is highly implementation-specific, as are the trigger field's
string values.</t>
        <t>One purely illustrative example of some potential triggers for QUIC's
"packet_dropped" event is shown in <xref target="trigger-ex"/>:</t>
        <figure anchor="trigger-ex">
          <name>Trigger example</name>
          <artwork><![CDATA[
TransportPacketDropped = {
    ? packet_type: PacketType
    ? raw_length: uint16
    ? trigger: "key_unavailable" /
               "unknown_connection_id" /
               "decrypt_error" /
               "unsupported_version"
}
]]></artwork>
        </figure>
      </section>
      <section anchor="group-ids">
        <name>Grouping</name>
        <t>As discussed in <xref target="trace"/>, a single qlog file can contain several traces taken
from different vantage points. However, a single trace from one endpoint can also
contain events from a variety of sources. For example, a server implementation
might choose to log events for all incoming connections in a single large
(streamed) qlog file. As such, a method for splitting up events belonging
to separate logical entities is required.</t>
        <t>The simplest way to perform this splitting is by associating a "group id"
to each event that indicates to which conceptual "group" each event belongs. A
post-processing step can then extract events per group. However, this group
identifier can be highly protocol and context-specific. In the example above,
the QUIC "Original Destination Connection ID" could be used to uniquely identify a
connection. As such, they might add a "ODCID" field to each event. However, a
middlebox logging IP or TCP traffic might rather use four-tuples to identify
connections, and add a "four_tuple" field.</t>
        <t>As such, to provide consistency and ease of tooling in cross-protocol and
cross-context setups, qlog instead defines the common "group_id" field, which
contains a string value. Implementations are free to use their preferred string
serialization for this field, so long as it contains a unique value per logical
group. Some examples can be seen in <xref target="group-id-ex"/>.</t>
        <figure anchor="group-id-def">
          <name>GroupID definition</name>
          <sourcecode type="cddl"><![CDATA[
GroupID = text
]]></sourcecode>
        </figure>
        <t>JSON serialization example for events grouped by four tuples
and QUIC connection IDs:</t>
        <figure anchor="group-id-ex">
          <name>GroupID example</name>
          <artwork><![CDATA[
"events": [
    {
        "time": 1553986553579,
        "protocol_type": ["TCP", "TLS", "HTTP2"],
        "group_id": "ip1=2001:67c:1232:144:9498:6df6:f450:110b,
                   ip2=2001:67c:2b0:1c1::198,port1=59105,port2=80",
        "name": "quic:packet_received",
        "data": { ... }
    },
    {
        "time": 1553986553581,
        "protocol_type": ["QUIC","HTTP3"],
        "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",
        "name": "quic:packet_sent",
        "data": { ... }
    }
]
]]></artwork>
        </figure>
        <t>Note that in some contexts (for example a Multipath transport protocol) it might
make sense to add additional contextual per-event fields (for example "path_id"),
rather than use the group_id field for that purpose.</t>
        <t>Note also that, typically, a single trace only contains events belonging to a
single logical group (for example, an individual QUIC connection). As such,
instead of logging the "group_id" field with an identical value for each event
instance, this field is typically logged once in "common_fields", see
<xref target="common-fields"/>.</t>
      </section>
      <section anchor="systeminformation">
        <name>SystemInformation</name>
        <t>The "system_info" field can be used to record system-specific details related to an
event. This is useful, for instance, where an application splits work across
CPUs, processes, or threads and events for a single trace occur on potentially
different combinations thereof. Each field is optional to support deployment
diversity.</t>
        <sourcecode type="cddl"><![CDATA[
SystemInformation = {
  ? processor_id: uint32
  ? process_id: uint32
  ? thread_id: uint32
}
]]></sourcecode>
      </section>
      <section anchor="common-fields">
        <name>CommonFields</name>
        <t>As discussed in the previous sections, information for a typical qlog event varies
in three main fields: "time", "name" and associated data. Additionally, there are
also several more advanced fields that allow mixing events from different
protocols and contexts inside of the same trace (for example "protocol_type" and
"group_id"). In most "normal" use cases however, the values of these advanced
fields are consistent for each event instance (for example, a single trace
contains events for a single QUIC connection).</t>
        <t>To reduce file size and making logging easier, qlog uses the "common_fields" list
to indicate those fields and their values that are shared by all events in this
component trace. This prevents these fields from being logged for each individual
event. An example of this is shown in <xref target="common-fields-ex"/>.</t>
        <figure anchor="common-fields-ex">
          <name>CommonFields example</name>
          <artwork><![CDATA[
JSON serialization with repeated field values
per-event instance:

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

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

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

JSON serialization with repeated field values instead
extracted to common_fields:

{
    "common_fields": {
        "group_id": "127ecc830d98f9d54a42c4f0842aa87e181a",
        "protocol_type": ["QUIC","HTTP3"],
        "time_format": "relative",
        "reference_time": 1553986553572
    },
    "events": [
        {
            "time": 2,
            "name": "quic:packet_received",
            "data": { ... }
        },{
            "time": 7,
            "name": "http:frame_parsed",
            "data": { ... }
        }
    ]
}
]]></artwork>
        </figure>
        <t>An event's "common_fields" field is a generic dictionary of key-value pairs, where the
key is always a string and the value can be of any type, but is typically also a
string or number. As such, unknown entries in this dictionary <bcp14>MUST</bcp14> be disregarded
by the user and tools (i.e., the presence of an unknown field is explicitly NOT an
error).</t>
        <t>The list of default qlog fields that are typically logged in common_fields (as
opposed to as individual fields per event instance) are shown in the listing
below:</t>
        <figure anchor="common-fields-def">
          <name>CommonFields definition</name>
          <sourcecode type="cddl"><![CDATA[
CommonFields = {
    ? path: PathID
    ? time_format: TimeFormat
    ? reference_time: float64
    ? protocol_type: ProtocolTypeList
    ? group_id: GroupID
    * text => any
}
]]></sourcecode>
        </figure>
        <t>Tools <bcp14>MUST</bcp14> be able to deal with these fields being defined either on each event
individually or combined in common_fields. Note that if at least one event in a
trace has a different value for a given field, this field <bcp14>MUST NOT</bcp14> be added to
common_fields but instead defined on each event individually. Good example of such
fields are "time" and "data", who are divergent by nature.</t>
      </section>
    </section>
    <section anchor="event-types-and-schema">
      <name>Concrete Event Types and Event Schema</name>
      <t>Concrete event types belong to event categories, both contained in event schema.</t>
      <t>A single event schema can either define a new namespace, or extend an existing
namespace with new categories. New namespaces <bcp14>MUST</bcp14> be registered using a
non-empty namespace identifier text identifier using only characters in the
unreserved range; see <xref section="2.3" sectionFormat="of" target="RFC3986"/>. Namespace are mutable and <bcp14>MAY</bcp14>
be extended with categories.</t>
      <t>Event categories <bcp14>MUST</bcp14> belong to a single event namespace. They <bcp14>MUST</bcp14> have a
registered non-empty globally-unique text identifier using only characters in
the URI unreserved range; see <xref section="2.3" sectionFormat="of" target="RFC3986"/>. They <bcp14>MUST</bcp14> have a
single URI <xref target="RFC3986"/> that <bcp14>MUST</bcp14> be absolute. The URI <bcp14>MUST</bcp14> include the namespace
identifier. The URI <bcp14>MUST</bcp14> include the category identifer using a fragment
identifier (characters after a "#" in the URI). Event categories are immutable
and <bcp14>MUST NOT</bcp14> be extended with events. Registration guidance and requirement for
category URIs are provided in <xref target="event-schema-reg"/>.</t>
      <t>Concrete event types <bcp14>MUST</bcp14> belong to a single event category and <bcp14>MUST</bcp14> have a
non-empty name of type <tt>text</tt>.</t>
      <t>The value of a qlog event <tt>name</tt> field <bcp14>MUST</bcp14> be the concatenation of category
identifier, colon (':'), and event type identifier. By virtue of the identifier
requirements described above, event names are globally-unique. Thus, log files
can contain events from multiple schemas without the risk of name collisions.</t>
      <t>Implementations that might record concrete event types belonging to a category
in an event schema <bcp14>SHOULD</bcp14> list all category identifiers in use. This is achieved
by including the appropriate URIs in the <tt>event_schemas</tt> field of the abstract
LogFile class (<xref target="abstract-logfile"/>). The <tt>event_schemas</tt> is a hint to tools
about the possible event categories (and event types contained therein) that a
qlog file might contain. The file <bcp14>MAY</bcp14> contain event types that do not belong to
a listed category identifier. Inversely, not all event types associated with a
category listed in <tt>event_schemas</tt> are guaranteed to be logged in a qlog file.
Tools <bcp14>MUST NOT</bcp14> treat either of these as an error; see <xref target="tooling"/>.</t>
      <t>In the following hypothetical example, a qlog file contains events belonging to
two categories in the generic event schema defined in this document
(<xref target="generic-event-schema"/>), to three categories in an event schema named <tt>rick</tt>
specified in a hypothetical RFC, and to three more categories from a private
event schema named pickle. The standardized category URIs use a URN format, the
private categories use a URI with domain name.</t>
      <figure anchor="event-categories">
        <name>Example event_categories serialization</name>
        <artwork><![CDATA[
"event_schemas": [
  "urn:ietf:params:qlog:events:gen#loglevel",
  "urn:ietf:params:qlog:events:gen#sim",
  "urn:ietf:params:qlog:events:rick#roll",
  "urn:ietf:params:qlog:events:rick#astley",
  "urn:ietf:params:qlog:events:rick#moranis",
  "https://example.com/032024/pickle.html#pepper",
  "https://example.com/032024/pickle.html#lilly",
  "https://example.com/032024/pickle.html#rick"
]
]]></artwork>
      </figure>
      <section anchor="event-schema-reg">
        <name>Event Schema and Event Category URIs</name>
        <t>Event schema defined by RFCs <bcp14>MUST</bcp14> register all categories in the "qlog event
category URIs" registry and <bcp14>SHOULD</bcp14> use a URN of the form
<tt>urn:ietf:params:qlog:events:&lt;namespace identifier&gt;#&lt;category identifier&gt;</tt>,
where <tt>&lt;category identifier&gt;</tt> is globally unique. For example, this document
defines the generic event schema (<xref target="generic-event-schema"/>) that uses the <tt>gen</tt>
namespace containing the <tt>loglevel</tt> and <tt>sim</tt> categories. Other examples of
event schema define the <tt>quic</tt> <xref target="QLOG-QUIC"/> and <tt>http</tt> <xref target="QLOG-H3"/> namespaces.</t>
        <t>Private or non-standard event categories <bcp14>MAY</bcp14> be registered in the "qlog event
category URIs" registry but <bcp14>MUST NOT</bcp14> use a URN of the form
<tt>urn:ietf:params:qlog:events:&lt;namespace identifier&gt;#&lt;category identifier&gt;</tt>. URIs
that contain a domain name <bcp14>SHOULD</bcp14> also contain a month-date in the form mmyyyy.
For example,
"https://example.org/072024/customeventschema#globallyuniquecategory". The
definition of the category and assignment of the URI <bcp14>MUST</bcp14> have been authorized
by the owner of the domain name on or very close to that date. This avoids
problems when domain names change ownership. The URI does not need to be
dereferencable, allowing for confidential use or to cover the case where the log
file schema continues to be used after the organization that defined them ceases
to exist.</t>
        <t>The "qlog event category URIs" registry operates under the Expert Review policy,
per <xref section="4.5" sectionFormat="of" target="RFC8126"/>.  When reviewing requests, the expert <bcp14>MUST</bcp14> check
that the URI is appropriate to the event schema and satisfies the requirements
in <xref target="event-types-and-schema"/> and this section. A request to register a private
or non-standard category URI using a URN of the form
<tt>urn:ietf:params:qlog:events:&lt;namespace identifier&gt;#&lt;category identifier</tt> <bcp14>MUST</bcp14> be
rejected.</t>
        <t>Registration requests should use the following template:</t>
        <dl>
          <dt>Event Category URI:</dt>
          <dd>
            <t>[the event category identifier]</t>
          </dd>
          <dt>Description:</dt>
          <dd>
            <t>[a description of the event category]</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>[to a specification defining the event schema defining the event category]</t>
          </dd>
        </dl>
      </section>
      <section anchor="data-field">
        <name>Extending the Data Field</name>
        <t>An event's "data" field is a generic key-value map (e.g., JSON object). It
defines the per-event metadata that is to be logged. Its specific subfields and
their semantics are defined per concrete event type. For example, data field
definitions for QUIC and HTTP/3 can be found in <xref target="QLOG-QUIC"/> and <xref target="QLOG-H3"/>.</t>
        <t>In order to keep qlog fully extensible, two separate CDDL extension points
("sockets" or "plugs") are used to fully define data fields.</t>
        <t>Firstly, to allow existing data field definitions to be extended (for example by
adding an additional field needed for a new protocol feature), a CDDL "group
socket" is used. This takes the form of a subfield with a name of
<tt>* $$CATEGORY-NAME-extension</tt>. This field acts as a placeholder that can later be
replaced with newly defined fields by assigning them to the socket with the
<tt>//=</tt> operator. Multiple extensions can be assigned to the same group socket. An
example is shown in <xref target="groupsocket-extension-example"/>.</t>
        <figure anchor="groupsocket-extension-example">
          <name>Example of using a generic CDDL group socket to extend an existing event data definition</name>
          <artwork><![CDATA[
; original definition in document A
MyCategoryEventX = {
    field_a: uint8

    * $$mycategory-eventx-extension
}

; later extension of EventX in document B
$$mycategory-eventx-extension //= (
  ? additional_field_b: bool
)

; another extension of EventX in document C
$$mycategory-eventx-extension //= (
  ? additional_field_c: text
)

; if document A, B and C are then used in conjunction,
; the combined MyCategoryEventX CDDL is equivalent to this:
MyCategoryEventX = {
    field_a: uint8

    ? additional_field_b: bool
    ? additional_field_c: text
}
]]></artwork>
        </figure>
        <t>Secondly, to allow documents to define fully new event data field definitions
(as opposed to extend existing ones), a CDDL "type socket" is used. For this
purpose, the type of the "data" field in the qlog Event type (see <xref target="event-def"/>)
is the extensible <tt>$ProtocolEventData</tt> type. This field acts as an open enum of
possible types that are allowed for the data field. As such, any new event data
field is defined as its own CDDL type and later merged with the existing
<tt>$ProtocolEventData</tt> enum using the <tt>/=</tt> extension operator. Any generic
key-value map type can be assigned to <tt>$ProtocolEventData</tt> (the only common
"data" subfield defined in this document is the optional <tt>trigger</tt> field, see
<xref target="trigger-field"/>). An example of this setup is shown in
<xref target="protocoleventdata-def"/>.</t>
        <figure anchor="protocoleventdata-def">
          <name>ProtocolEventData extension</name>
          <artwork><![CDATA[
; We define two separate events in a single document
MyCategoryEvent1 /= {
    field_1: uint8

    ? trigger: text

    * $$mycategory-event1-extension
}

MyCategoryEvent2 /= {
    field_2: bool

    ? trigger: text

    * $$mycategory-event2-extension
}

; the events are both merged with the existing
; $ProtocolEventData type enum
$ProtocolEventData /= MyCategoryEvent1 / MyCategoryEvent2

; the "data" field of a qlog event can now also be of type
; MyCategoryEvent1 and MyCategoryEvent2
]]></artwork>
        </figure>
        <t>Documents defining new qlog events <bcp14>MUST</bcp14> properly extend <tt>$ProtocolEventData</tt>
when defining data fields to enable automated validation of aggregated qlog
schemas. Furthermore, they <bcp14>SHOULD</bcp14> properly add a <tt>* $$CATEGORY-NAME-extension</tt>
extension field to newly defined event data to allow the new events to be
properly extended by other documents.</t>
        <t>A combined but purely illustrative example of the use of both extension points
for a conceptual QUIC "packet_sent" event is shown in <xref target="data-ex"/>:</t>
        <figure anchor="data-ex">
          <name>Example of an extended 'data' field for a conceptual QUIC packet_sent event</name>
          <artwork><![CDATA[
; defined in the main QUIC event document
TransportPacketSent = {
    ? packet_size: uint16
    header: PacketHeader
    ? frames:[* QuicFrame]
    ? trigger: "pto_probe" /
               "retransmit_timeout" /
               "bandwidth_probe"

    * $$transport-packetsent-extension
}

; Add the event to the global list of recognized qlog events
$ProtocolEventData /= TransportPacketSent

; Defined in a separate document that describes a
; theoretical QUIC protocol extension
$$transport-packetsent-extension //= (
  ? additional_field: bool
)

; If both documents are utilized at the same time,
; the following JSON serialization would pass an automated
; CDDL schema validation check:

{
  "time": 123456,
  "category": "transport",
  "name": "packet_sent",
  "data": {
      "packet_size": 1280,
      "header": {
          "packet_type": "1RTT",
          "packet_number": 123
      },
      "frames": [
          {
              "frame_type": "stream",
              "length": 1000,
              "offset": 456
          },
          {
              "frame_type": "padding"
          }
      ],
      additional_field: true
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="importance">
        <name>Event Importance Levels</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, qlog defines three event importance levels, in
decreasing order of importance and expected usage:</t>
        <ul spacing="normal">
          <li>Core</li>
          <li>Base</li>
          <li>Extra</li>
        </ul>
        <t>Concrete event types <bcp14>SHOULD</bcp14> define an importance level.</t>
        <t>Core-level events <bcp14>SHOULD</bcp14> be present in all qlog files for a given protocol.
These are typically tied to basic packet and frame parsing and creation, as well
as listing basic internal metrics. Tool implementers <bcp14>SHOULD</bcp14> expect and add
support for these events, though <bcp14>SHOULD NOT</bcp14> expect all Core events to be present
in each qlog trace.</t>
        <t>Base-level events add additional debugging options and <bcp14>MAY</bcp14> be present in qlog
files. Most of these can be implicitly inferred from data in Core events (if
those contain all their properties), but for many it is better to log the events
explicitly as well, making it clearer how the implementation behaves. These
events are for example tied to passing data around in buffers, to how internal
state machines change, and used to help show when decisions are actually made
based on received data. Tool implementers <bcp14>SHOULD</bcp14> at least add support for
showing the contents of these events, if they do not handle them explicitly.</t>
        <t>Extra-level events are considered mostly useful for low-level debugging of the
implementation, rather than the protocol. They allow more fine-grained tracking
of internal behavior. As such, they <bcp14>MAY</bcp14> be present in qlog files and tool
implementers <bcp14>MAY</bcp14> add support for these, but they are not required to.</t>
        <t>Note that in some cases, implementers might not want to log for example data
content details in Core-level events due to performance or privacy considerations.
In this case, they <bcp14>SHOULD</bcp14> use (a subset of) relevant Base-level events instead to
ensure usability of the qlog output. As an example, implementations that do not
log QUIC <tt>packet_received</tt> events and thus also not which (if any) ACK frames the
packet contains, <bcp14>SHOULD</bcp14> log <tt>packets_acked</tt> events instead.</t>
        <t>Finally, for event types whose data (partially) overlap with other event types'
definitions, where necessary the event definition document should include explicit
guidance on which to use in specific situations.</t>
      </section>
      <section anchor="tooling-expectations">
        <name>Tooling Expectations</name>
        <t>qlog is an extensible format and it is expected that new event schema will
emerge that define new categories, event types, event fields (e.g., a field
indicating an event's privacy properties), 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>It <bcp14>SHOULD NOT</bcp14> be expected that general-purpose tools will recognize or visualize
all forms of qlog extension. Tools <bcp14>SHOULD</bcp14> allow for the presence of unknown
event fields and make an effort to visualize even unknown data if possible,
otherwise they <bcp14>MUST</bcp14> ignore it.</t>
      </section>
      <section anchor="further-design-guidance">
        <name>Further Design Guidance</name>
        <t>There are several ways of defining concrete event types. In practice, two main
types of approach have been observed: a) those that map directly to concepts
seen in the protocols (e.g., <tt>packet_sent</tt>) and b) those that act as aggregating
events that combine data from several possible protocol behaviors or code paths
into one (e.g., <tt>parameters_set</tt>). The latter are typically used as a means to
reduce the amount of unique event definitions, as reflecting each possible
protocol event as a separate qlog entity would cause an explosion of event
types.</t>
        <t>Additionally, logging duplicate data is typically prevented as much as possible.
For example, packet header values that remain consistent across many packets are
split into separate events (for example <tt>spin_bit_updated</tt> or
<tt>connection_id_updated</tt> for QUIC).</t>
        <t>Finally, when logging additional state change events, those state changes can
often be directly inferred from data on the wire (for example flow control limit
changes). As such, if the implementation is bug-free and spec-compliant, logging
additional events is typically avoided. Exceptions have been made for common
events that benefit from being easily identifiable or individually logged (for
example <tt>packets_acked</tt>).</t>
      </section>
    </section>
    <section anchor="generic-event-schema">
      <name>The Generic Event Schema</name>
      <t>The generic event schema defines categories and event types that are common
across protocols, applications, and use cases. The schema namespace identifier
is "gen".</t>
      <section anchor="loglevel-events">
        <name>Log Level 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. The log
level event 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). The category identifier is "loglevel". The
category URI is is <tt>urn:ietf:params:qlog:events:gen#loglevel</tt>.</t>
        <figure anchor="loglevel-events-def">
          <name>LogLevelEventData and ProtocolEventData extension</name>
          <sourcecode type="cddl"><![CDATA[
LogLevelEventData = LogLevelError /
                    LogLevelWarning /
                    LogLevelInfo /
                    LogLevelDebug /
                    LogLevelVerbose

$ProtocolEventData /= LogLevelEventData
]]></sourcecode>
        </figure>
        <t>The event types are further defined below, their identifier is the heading name.</t>
        <section anchor="error">
          <name>error</name>
          <t>Used to log details of an internal error that might not get reflected on the
wire. It has Core importance level; see <xref target="importance"/>.</t>
          <figure anchor="loglevel-error-def">
            <name>LogLevelError definition</name>
            <sourcecode type="cddl"><![CDATA[
LogLevelError = {
    ? code: uint64
    ? message: text

    * $$loglevel-error-extension
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="warning">
          <name>warning</name>
          <t>Used to log details of an internal warning that might not get reflected on the
wire. It has Base importance level; see <xref target="importance"/>.</t>
          <figure anchor="loglevel-warning-def">
            <name>LogLevelWarning definition</name>
            <sourcecode type="cddl"><![CDATA[
LogLevelWarning = {
    ? code: uint64
    ? message: text

    * $$loglevel-warning-extension
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="info">
          <name>info</name>
          <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. The event
has Extra importance level; see <xref target="importance"/>.</t>
          <figure anchor="loglevel-info-def">
            <name>LogLevelInfo definition</name>
            <sourcecode type="cddl"><![CDATA[
LogLevelInfo = {
    message: text

    * $$loglevel-info-extension
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="debug">
          <name>debug</name>
          <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. The event
has Extra importance level; see <xref target="importance"/>.</t>
          <figure anchor="loglevel-debug-def">
            <name>LogLevelDebug definition</name>
            <sourcecode type="cddl"><![CDATA[
LogLevelDebug = {
    message: text

    * $$loglevel-debug-extension
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="verbose">
          <name>verbose</name>
          <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. The event
has Extra importance level; see <xref target="importance"/>.</t>
          <figure anchor="loglevel-verbose-def">
            <name>LogLevelVerbose definition</name>
            <sourcecode type="cddl"><![CDATA[
LogLevelVerbose = {
    message: text

    * $$loglevel-verbose-extension
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="sim-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. This category defines event types to allow
logging of such simulation metadata and its identifier is "sim". The category
URI is <tt>urn:ietf:params:qlog:events:gen#sim</tt>.</t>
        <figure anchor="sim-events-def">
          <name>SimulationEventData and ProtocolEventData extension</name>
          <sourcecode type="cddl"><![CDATA[
SimulationEventData = SimulationScenario /
                SimulationMarker

$ProtocolEventData /= SimulationEventData
]]></sourcecode>
        </figure>
        <t>The event types are further defined below, their identifier is the heading name.</t>
        <section anchor="scenario">
          <name>scenario</name>
          <t>Used to specify which specific scenario is being tested at this particular
instance. This supports, for example, aggregation of several simulations into
one trace (e.g., split by <tt>group_id</tt>). It has Extra importance level; see
<xref target="importance"/>.</t>
          <figure anchor="simulation-scenario-def">
            <name>SimulationScenario definition</name>
            <sourcecode type="cddl"><![CDATA[
SimulationScenario = {
    ? name: text
    ? details: {* text => any }

    * $$simulation-scenario-extension
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="marker">
          <name>marker</name>
          <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). It has Extra importance level; see <xref target="importance"/>.</t>
          <figure anchor="simulation-marker-def">
            <name>SimulationMarker definition</name>
            <sourcecode type="cddl"><![CDATA[
SimulationMarker = {
    ? type: text
    ? message: text

    * $$simulation-marker-extension
}
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="raw-info">
      <name>Raw packet and frame information</name>
      <t>While qlog is a high-level logging format, it also allows the inclusion of most
raw wire image information, such as byte lengths and byte values. This is useful
when for example investigating or tuning packetization behavior or determining
encoding/framing overheads. However, these fields are not always necessary, can
take up considerable space, and can have a considerable privacy and security
impact (see <xref target="privacy"/>). Where applicable, these fields are grouped in a
separate, optional, field named "raw" of type RawInfo. The exact definition of
entities, headers, trailers and payloads depend on the protocol used.</t>
      <figure anchor="raw-info-def">
        <name>RawInfo definition</name>
        <sourcecode type="cddl"><![CDATA[
RawInfo = {

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

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

    ; the (potentially truncated) contents of the full entity,
    ; including headers and possibly trailers
    ? data: hexstring
}
]]></sourcecode>
      </figure>
      <t>The RawInfo:data field can be truncated for privacy or security purposes, see
<xref target="truncated-values"/>. In this case, the length and payload_length fields should
still indicate the non-truncated lengths when used for debugging purposes.</t>
      <t>This document does not specify explicit header_length or trailer_length fields.
In protocols without trailers, header_length can be calculated by subtracting
the payload_length from the length. In protocols with trailers (e.g., QUIC's
AEAD tag), event definition documents <bcp14>SHOULD</bcp14> define how to support header_length
calculation.</t>
    </section>
    <section anchor="concrete-formats">
      <name>Serializing qlog</name>
      <t>qlog schema definitions in this document are intentionally agnostic to
serialization formats. The choice of format is an implementation decision.</t>
      <t>Other documents related to qlog (for example event definitions for specific
protocols), <bcp14>SHOULD</bcp14> be similarly agnostic to the employed serialization format
and <bcp14>SHOULD</bcp14> clearly indicate this. If not, they <bcp14>MUST</bcp14> include an explanation on
which serialization formats are supported and on how to employ them correctly.</t>
      <t>Serialization formats make certain tradeoffs between usability, flexibility,
interoperability, and efficiency. Implementations should take these into
consideration when choosing a format. Some examples of possible formats are
JSON, CBOR, CSV, protocol buffers, flatbuffers, etc. which each have their own
characteristics. For instance, a textual format like JSON can be more flexible
than a binary format but more verbose, typically making it less efficient than a
binary format. A plaintext readable (yet relatively large) format like JSON is
potentially more usable for users operating on the logs directly, while a more
optimized yet restricted format can better suit the constraints of a large scale
operation. A custom or restricted format could be more efficient for analysis
with custom tooling but might not be interoperable with general-purpose qlog
tools.</t>
      <t>Considering these tradeoffs, JSON-based serialization formats provide features
that make them a good starting point for qlog flexibility and interoperability.
For these reasons, JSON is a recommended default and expanded considerations are
given to how to map qlog to JSON (<xref target="format-json"/>, and its streaming counterpart
JSON Text Sequences (<xref target="format-json-seq"/>. <xref target="json-interop"/> presents
interoperability considerations for both formats, and <xref target="optimizations"/> presents
potential optimizations.</t>
      <t>Serialization formats require appropriate deserializers/parsers. The
"serialization_format" field (<xref target="abstract-logfile"/>) is used to indicate the
chosen serialization format.</t>
      <section anchor="format-json">
        <name>qlog to JSON mapping</name>
        <t>As described in <xref target="qlog-file-schema"/>, JSON is the default qlog serialization.
When mapping qlog to normal JSON, QlogFile (<xref target="qlog-file-def"/>) is used. The
Media Type is "application/qlog+json" per <xref target="RFC6839"/>. The file
extension/suffix <bcp14>SHOULD</bcp14> be ".qlog".</t>
        <t>In accordance with <xref section="8.1" sectionFormat="of" target="RFC8259"/>, JSON files are required to use
UTF-8 both for the file itself and the string values it contains. In addition,
all qlog field names <bcp14>MUST</bcp14> be lowercase when serialized to JSON.</t>
        <t>In order to serialize CDDL-based qlog event and data structure
definitions to JSON, the official CDDL-to-JSON mapping defined in
<xref section="E" sectionFormat="of" target="CDDL"/> <bcp14>SHOULD</bcp14> be employed.</t>
      </section>
      <section anchor="format-json-seq">
        <name>qlog to JSON Text Sequences mapping</name>
        <t>One of the downsides of using normal JSON is that it is inherently a
non-streamable format. A qlog serializer could work around this by opening a
file, writing the required opening data, streaming qlog events by appending
them, and then finalizing the log by appending appropriate closing tags e.g.,
"]}]}". However, failure to append closing tags, could lead to problems because
most JSON parsers will fail if a document is malformed. Some streaming JSON
parsers are able to handle missing closing tags, however they are not widely
deployed in popular environments (e.g., Web browsers)</t>
        <t>To overcome the issues related to JSON streaming, a qlog mapping to a streamable
JSON format called JSON Text Sequences (JSON-SEQ) (<xref target="RFC7464"/>) is provided.</t>
        <t>JSON Text Sequences are very similar to JSON, except that 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>In order to leverage the streaming capability, each qlog event is serialized and
interpreted as an individual JSON Text Sequence record, that is appended as a
new object to the back of an event stream or log file. Put differently, unlike
default JSON, it does not require a document to be wrapped as a full object with
"{ ... }" or "[... ]".</t>
        <t>This alternative record streaming approach cannot be accommodated by QlogFile
(<xref target="qlog-file-def"/>). Instead, QlogFileSeq is defined in <xref target="qlog-file-seq-def"/>,
which notably includes only a single trace (TraceSeq) and omits an explicit
"events" array. An example is provided in <xref target="json-seq-ex"/>. The "group_id" field
can still be used on a per-event basis to include events from conceptually
different sources in a single JSON-SEQ qlog file.</t>
        <t>When mapping qlog to JSON-SEQ, the Media Type is "application/qlog+json-seq" per
<xref target="RFC8091"/>. The file extension/suffix <bcp14>SHOULD</bcp14> be ".sqlog" (for "streaming"
qlog).</t>
        <t>While not specifically required by the JSON-SEQ specification, all qlog field
names <bcp14>MUST</bcp14> be lowercase when serialized to JSON-SEQ.</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
<xref section="E" sectionFormat="of" target="CDDL"/> <bcp14>SHOULD</bcp14> 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="json-interop">
        <name>JSON Interoperability</name>
        <t>Some JSON implementations have issues with the full JSON format, especially those
integrated within a JavaScript environment (e.g., Web browsers, NodeJS). I-JSON
(Internet-JSON) is a subset of JSON for such environments; see
<xref target="I-JSON"/>. 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
-(2<sup>53</sup>)+1 to (2<sup>53</sup>)-1.</t>
        <t>To accommodate such constraints in CDDL, <xref section="E" sectionFormat="of" target="CDDL"/> recommends
defining new CDDL types for int64 and uint64 that limit their values to the
restricted 64-bit integer range. However, some of the protocols that qlog is
intended to support (e.g., QUIC, HTTP/3), can use the full range of uint64
values.</t>
        <t>As such, to support situations where I-JSON is in use, seralizers <bcp14>MAY</bcp14> encode
uint64 values using JSON strings. qlog parsers, therefore, <bcp14>SHOULD</bcp14> support
parsing of uint64 values from JSON strings or JSON numbers unless there is out-of-band
information indicating that neither the serializer nor parser are constrained by
I-JSON.</t>
      </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, one might only store the first 100 bytes of an
HTTP response body to be able to discern which file it actually
contained. In these cases, the original byte-size length cannot be
obtained from the serialized value directly.</t>
        <t>As such, all qlog schema definitions <bcp14>SHOULD</bcp14> include a separate,
length-indicating field for all fields of type <tt>hexstring</tt> they specify,
see for example <xref target="raw-info"/>. This not only ensures the original length
can always be retrieved, but also allows the omission of any raw value
bytes of the field completely (e.g., out of privacy or security
considerations).</t>
        <t>To reduce overhead however and in the case the full raw value is logged,
the extra length-indicating field can be left out. As such, tools <bcp14>MUST</bcp14>
be able to deal with this situation and derive the length of the field
from the raw value if no separate length-indicating field is present.
The main possible permutations are shown by example in
<xref target="truncated-values-ex"/>.</t>
        <figure anchor="truncated-values-ex">
          <name>Example for serializing truncated hexstrings</name>
          <artwork><![CDATA[
// both the content's value and its length are present
// (length is redundant)
{
    "content_length": 5,
    "content": "051428abff"
}

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

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

// both value and length are present, but the lengths
// do not match: the value was truncated to
// the first three bytes.
{
    "content_length": 5,
    "content": "051428"
}
]]></artwork>
        </figure>
      </section>
      <section anchor="optimizations">
        <name>Optimization of serialized data</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 present challenges to
large scale setups, though they may still be practical to deploy; see <xref target="ANRW-2020"/>.
JSON and JSON-SEQ compress very well using commonly-available algorithms such as
GZIP or Brotli.</t>
        <t>During the development of qlog, a multitude of alternative formatting
and optimization options were assessed and the results are <eref target="https://github.com/quiclog/internet-drafts/issues/30#issuecomment-617675097">summarized on the qlog
github
repository</eref>.</t>
        <t>Formal definition of additional qlog formats or encodings that use the
optimization techniques described here, or any other optimization technique is
left to future activity that can apply the following guidelines.</t>
        <t>In order to help tools correctly parse and process serialized qlog, it is
<bcp14>RECOMMENDED</bcp14> that new formats also define suitable file extensions and media
types. This provides a clear signal and avoids the need to provide out-of-band
information or to rely on heuristic fallbacks; see <xref target="tooling"/>.</t>
      </section>
    </section>
    <section anchor="methods-of-access-and-generation">
      <name>Methods of access and generation</name>
      <t>Different implementations will have different ways of generating and storing
qlogs. However, there is still value in defining a few default ways in which to
steer this generation and access of the results.</t>
      <section anchor="set-file-output-destination-via-an-environment-variable">
        <name>Set file output destination via an environment variable</name>
        <t>To provide users control over where and how qlog files are created, two
environment variables are defined. The first, QLOGFILE, indicates a full path to where an
individual qlog file should be stored. This path <bcp14>MUST</bcp14> include the full file
extension. The second, QLOGDIR, sets a general directory path in which qlog files
should be placed. This path <bcp14>MUST</bcp14> include the directory separator character at the
end.</t>
        <t>In general, QLOGDIR should be preferred over QLOGFILE if an endpoint is prone to
generate multiple qlog files. This can for example be the case for a QUIC server
implementation that logs each QUIC connection in a separate qlog file. An
alternative that uses QLOGFILE would be a QUIC server that logs all connections in
a single file and uses the "group_id" field (<xref target="group-ids"/>) to allow post-hoc
separation of events.</t>
        <t>Implementations <bcp14>SHOULD</bcp14> provide support for QLOGDIR and <bcp14>MAY</bcp14> provide support for
QLOGFILE.</t>
        <t>When using QLOGDIR, it is up to the implementation to choose an appropriate naming
scheme for the qlog files themselves. The chosen scheme will typically depend on
the context or protocols used. For example, for QUIC, it is recommended to use the
Original Destination Connection ID (ODCID), followed by the vantage point type of
the logging endpoint. Examples of all options for QUIC are shown in
<xref target="qlogdir-example"/>.</t>
        <figure anchor="qlogdir-example">
          <name>Environment variable examples for a QUIC implementation</name>
          <artwork><![CDATA[
Command: QLOGFILE=/srv/qlogs/client.qlog quicclientbinary

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

Command: QLOGDIR=/srv/qlogs/ quicserverbinary

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

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

Should result in the the quicserverbinary executable logging
a single qlog file named server.qlog in the /srv/qlogs directory.
Given that the server handled two QUIC connections before it was
shut down, with ODCID values "abcde" and "12345" respectively,
this would result in event instances in the qlog file being
tagged with the "group_id" field with values "abcde" and "12345".
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="tooling">
      <name>Tooling requirements</name>
      <t>Tools ingestion qlog <bcp14>MUST</bcp14> indicate which qlog version(s), qlog format(s),
compression methods and potentially other input file formats (for example .pcap)
they support. Tools <bcp14>SHOULD</bcp14> at least support .qlog files in the default JSON format
(<xref target="format-json"/>). Additionally, they <bcp14>SHOULD</bcp14> indicate exactly which values for and
properties of the name (category and type) and data fields they look for to
execute their logic. Tools <bcp14>SHOULD</bcp14> perform a (high-level) check if an input qlog
file adheres to the expected qlog schema. If a tool determines a qlog file does
not contain enough supported information to correctly execute the tool's logic, it
<bcp14>SHOULD</bcp14> generate a clear error message to this effect.</t>
      <t>Tools <bcp14>MUST NOT</bcp14> produce breaking errors for any field names and/or values in the
qlog format that they do not recognize. Tools <bcp14>SHOULD</bcp14> indicate even unknown event
occurrences within their context (e.g., marking unknown events on a timeline for
manual interpretation by the user).</t>
      <t>Tool authors should be aware that, depending on the logging implementation, some
events will not always be present in all traces. For example, using a circular
logging buffer of a fixed size, it could be that the earliest events (e.g.,
connection setup events) are later overwritten by "newer" events. Alternatively,
some events can be intentionally omitted out of privacy or file size
considerations. Tool authors are encouraged to make their tools robust enough to
still provide adequate output for incomplete logs.</t>
    </section>
    <section anchor="privacy">
      <name>Security and privacy considerations</name>
      <t>Protocols such as TLS <xref target="RFC8446"/> and QUIC <xref target="RFC9000"/> offer secure protection
for the wire image <xref target="RFC8546"/>. Logging can reveal aspects of the wire image
that would ordinarily be protected, creating tension between observability,
security and privacy, especially if data can be correlated across data sources.</t>
      <t>qlog permits logging of a broad and detailed range of data. Operators and
implementers are responsible for deciding what data is logged to address their
requirements and constraints. As per <xref target="RFC6973"/>, operators must be aware that
data could be compromised, risking the privacy of all participants. Where
entities expect protocol features to ensure data privacy, logging might
unknowingly be subject to broader privacy risks, undermining their ability to
assess or respond effectively.</t>
      <section anchor="data-at-risk">
        <name>Data at risk</name>
        <t>qlog operators and implementers need to consider security and privacy risks when
handling qlog data, including logging, storage, usage, and more. The
considerations presented in this section may pose varying risks depending on the
the data itself or its handling.</t>
        <t>The following is a non-exhaustive list of example data types that could contain
sensitive information that might allow identification or correlation of
individual connections, endpoints, users or sessions across qlog or other data
sources (e.g., captures of encrypted packets):</t>
        <ul spacing="normal">
          <li>IP addresses and transport protocol port numbers.</li>
          <li>Session, Connection, or User identifiers e.g., QUIC Connection IDs <xref section="9.5" sectionFormat="of" target="RFC9000"/>).</li>
          <li>System-level information e.g., CPU, process, or thread identifiers.</li>
          <li>Stored State e.g., QUIC address validation and retry tokens, TLS session
tickets, and HTTP cookies.</li>
          <li>TLS decryption keys, passwords, and HTTP-level API access or authorization tokens.</li>
          <li>High-resolution event timestamps or inter-event timings, event counts, packet
sizes, and frame sizes.</li>
          <li>Full or partial raw packet and frame payloads that are encrypted.</li>
          <li>Full or partial raw packet and frame payloads that are plaintext e.g., HTTP Field
values, HTTP response data, or TLS SNI field values.</li>
        </ul>
      </section>
      <section anchor="operational-implications-and-recommendations">
        <name>Operational implications and recommendations</name>
        <t>Operational considerations should focus on authorizing capture and access to logs. Logging of
Internet protocols using qlog can be equivalent to the ability to store or read plaintext
communications. Without a more detailed analysis, all of the security considerations of plaintext access apply.</t>
        <t>It is recommended that qlog capture is subject to access control and auditing.
These controls should support granular levels of information capture based on
role and permissions (e.g., capture of more-sensitive data requires higher
privileges).</t>
        <t>It is recommended that access to stored qlogs is subject to access control and
auditing.</t>
        <t>End users might not understand the implications of qlog to security or privacy,
and their environments might limit access control techniques. Implementations should
make enabling qlog conspicuous (e.g., requiring clear and explicit actions to
start a capture) and resistant to social engineering, automation, or drive-by
attacks; for example, isolation or sandboxing of capture from other activities
in the same process or component.</t>
        <t>It is recommended that data retention policies are defined for the storage of
qlog files.</t>
        <t>It is recommended that qlog files are encrypted in transit and at rest.</t>
      </section>
      <section anchor="data-minimization-or-anonymization">
        <name>Data minimization or anonymization</name>
        <t>Applying data minimization or anonymization techniques to qlog might help
address some security and privacy risks. However, removing or anonymizing data
without sufficient care might not enhance privacy or security and
could diminish the utility of qlog data.</t>
        <t>Operators and implementers should balance the value of logged data with the
potential risks of voluntary or involuntary disclosure to trusted or untrusted
entities. Importantly, both the breadth and depth of the data needed to make it
 useful, as well as the definition of entities depend greatly on the intended
use cases. For example, a research project might be tightly scoped, time bound,
and require participants to explicitly opt in to having their data collected
with the intention for this to be shared in a publication. Conversely, a server
administrator might desire to collect telemetry, from users whom they have no
relationship with, for continuing operational needs.</t>
        <t>The most extreme form of minimization or anonymization is deleting a field,
equivalent to not logging it. qlog implementations should offer fine-grained
control for this on a per-use-case or per-connection basis.</t>
        <t>Data can undergo anonymization, pseudonymization, permutation, truncation,
re-encryption, or aggregation; see <xref section="B" sectionFormat="of" target="DNS-PRIVACY"/> for
techniques, especially regarding IP addresses. However, operators should be
cautious because many anonymization methods have been shown to be insufficient to safeguard
user privacy or identity, particularly with large or easily correlated data sets.</t>
        <t>Operators should consider end user rights and preferences. Active user participation (as
indicated by <xref target="RFC6973"/>) on a per-qlog basis is challenging but aligning qlog
capture, storage, and removal with existing user preference and privacy controls
is crucial. Operators should consider agressive approaches to deletion or
aggregation.</t>
        <t>The most sensitive data in qlog is typically contained in RawInfo type fields
(see <xref target="raw-info"/>). Therefore, qlog users should exercise caution and limit the
inclusion of such fields for all but the most stringent use cases.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>IANA is requested to register a new entry in the "IETF URN Sub-namespace for
Registered Protocol Parameter Identifiers" registry (<xref target="RFC3553"/>)":</t>
      <dl>
        <dt>Registered Parameter Identifier:</dt>
        <dd>
          <t>qlog</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t>This Document</t>
        </dd>
        <dt>IANA Registry Reference:</dt>
        <dd>
          <t><eref brackets="angle" target="https://www.iana.org/assignments/qlog"/></t>
        </dd>
      </dl>
      <t>IANA is requested to create the "qlog log file schema URIs" registry
at <eref target="https://www.iana.org/assignments/qlog"/> for the purpose of registering
log file schema. It has the following format:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Log File Schema URI</th>
            <th align="left">Description</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">urn:ietf:params:qlog:file:contained</td>
            <td align="left">Concrete log file schema that can contain several traces from multiple vantage points.</td>
            <td align="left">
              <xref target="qlog-file-schema"/></td>
          </tr>
          <tr>
            <td align="left">urn:ietf:params:qlog:file:sequential</td>
            <td align="left">Concrete log file schema containing a single trace, optimized for seqential read and write access.</td>
            <td align="left">
              <xref target="qlog-file-seq-schema"/></td>
          </tr>
        </tbody>
      </table>
      <t>IANA is requested to create the "qlog event category URIs" registry
at <eref target="https://www.iana.org/assignments/qlog"/> for the purpose of registering
event categories. It has the following format:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Event Category URI</th>
            <th align="left">Description</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">urn:ietf:params:qlog:events:gen#loglevel</td>
            <td align="left">Well-known logging levels for free-form text.</td>
            <td align="left">
              <xref target="loglevel-events"/></td>
          </tr>
          <tr>
            <td align="left">urn:ietf:params:qlog:events:gen#sim</td>
            <td align="left">Events for simulation testing.</td>
            <td align="left">
              <xref target="sim-events"/></td>
          </tr>
        </tbody>
      </table>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="JSON">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="I-JSON">
          <front>
            <title>The I-JSON Message Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>I-JSON (short for "Internet JSON") is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7493"/>
          <seriesInfo name="DOI" value="10.17487/RFC7493"/>
        </reference>
        <reference anchor="JSON-Text-Sequences">
          <front>
            <title>JavaScript Object Notation (JSON) Text Sequences</title>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="February" year="2015"/>
            <abstract>
              <t>This document describes the JavaScript Object Notation (JSON) text sequence format and associated media type "application/json-seq". A JSON text sequence consists of any number of JSON texts, all encoded in UTF-8, each prefixed by an ASCII Record Separator (0x1E), and each ending with an ASCII Line Feed character (0x0A).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7464"/>
          <seriesInfo name="DOI" value="10.17487/RFC7464"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="CDDL">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC2046">
          <front>
            <title>Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein"/>
            <date month="November" year="1996"/>
            <abstract>
              <t>This second document defines the general structure of the MIME media typing system and defines an initial set of media types. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2046"/>
          <seriesInfo name="DOI" value="10.17487/RFC2046"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="RFC7464">
          <front>
            <title>JavaScript Object Notation (JSON) Text Sequences</title>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="February" year="2015"/>
            <abstract>
              <t>This document describes the JavaScript Object Notation (JSON) text sequence format and associated media type "application/json-seq". A JSON text sequence consists of any number of JSON texts, all encoded in UTF-8, each prefixed by an ASCII Record Separator (0x1E), and each ending with an ASCII Line Feed character (0x0A).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7464"/>
          <seriesInfo name="DOI" value="10.17487/RFC7464"/>
        </reference>
        <reference anchor="RFC6839">
          <front>
            <title>Additional Media Type Structured Syntax Suffixes</title>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>A content media type name sometimes includes partitioned meta- information distinguished by a structured syntax to permit noting an attribute of the media as a suffix to the name. This document defines several structured syntax suffixes for use with media type registrations. In particular, it defines and registers the "+json", "+ber", "+der", "+fastinfoset", "+wbxml" and "+zip" structured syntax suffixes, and provides a media type structured syntax suffix registration form for the "+xml" structured syntax suffix. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6839"/>
          <seriesInfo name="DOI" value="10.17487/RFC6839"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC8091">
          <front>
            <title>A Media Type Structured Syntax Suffix for JSON Text Sequences</title>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <date month="February" year="2017"/>
            <abstract>
              <t>Structured syntax suffixes for media types allow other media types to build on them and make it explicit that they are built on an existing media type as their foundation. This specification defines and registers "+json-seq" as a structured syntax suffix for JSON text sequences.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8091"/>
          <seriesInfo name="DOI" value="10.17487/RFC8091"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC6973">
          <front>
            <title>Privacy Considerations for Internet Protocols</title>
            <author fullname="A. Cooper" initials="A." surname="Cooper"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="J. Peterson" initials="J." surname="Peterson"/>
            <author fullname="J. Morris" initials="J." surname="Morris"/>
            <author fullname="M. Hansen" initials="M." surname="Hansen"/>
            <author fullname="R. Smith" initials="R." surname="Smith"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document offers guidance for developing privacy considerations for inclusion in protocol specifications. It aims to make designers, implementers, and users of Internet protocols aware of privacy-related design choices. It suggests that whether any individual RFC warrants a specific privacy considerations section will depend on the document's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6973"/>
          <seriesInfo name="DOI" value="10.17487/RFC6973"/>
        </reference>
        <reference anchor="DNS-PRIVACY">
          <front>
            <title>Recommendations for DNS Privacy Service Operators</title>
            <author fullname="S. Dickinson" initials="S." surname="Dickinson"/>
            <author fullname="B. Overeinder" initials="B." surname="Overeinder"/>
            <author fullname="R. van Rijswijk-Deij" initials="R." surname="van Rijswijk-Deij"/>
            <author fullname="A. Mankin" initials="A." surname="Mankin"/>
            <date month="October" year="2020"/>
            <abstract>
              <t>This document presents operational, policy, and security considerations for DNS recursive resolver operators who choose to offer DNS privacy services. With these recommendations, the operator can make deliberate decisions regarding which services to provide, as well as understanding how those decisions and the alternatives impact the privacy of users.</t>
              <t>This document also presents a non-normative framework to assist writers of a Recursive operator Privacy Statement, analogous to DNS Security Extensions (DNSSEC) Policies and DNSSEC Practice Statements described in RFC 6841.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="232"/>
          <seriesInfo name="RFC" value="8932"/>
          <seriesInfo name="DOI" value="10.17487/RFC8932"/>
        </reference>
        <reference anchor="RFC3553">
          <front>
            <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <author fullname="T. Hardie" initials="T." surname="Hardie"/>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <date month="June" year="2003"/>
            <abstract>
              <t>This document describes a new sub-delegation for the 'ietf' URN namespace for registered protocol items. The 'ietf' URN namespace is defined in RFC 2648 as a root for persistent URIs that refer to IETF- defined resources. 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="73"/>
          <seriesInfo name="RFC" value="3553"/>
          <seriesInfo name="DOI" value="10.17487/RFC3553"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="QLOG-QUIC">
          <front>
            <title>QUIC event definitions for qlog</title>
            <author fullname="Robin Marx" initials="R." surname="Marx">
              <organization>Akamai</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Meta</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="4" month="March" year="2024"/>
            <abstract>
              <t>   This document describes concrete qlog event definitions and their
   metadata for QUIC events.  These events can then be embedded in the
   higher level schema defined in [QLOG-MAIN].

Note to Readers

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

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

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

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

Note to Readers

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

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

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-h3-events-07"/>
        </reference>
        <reference anchor="ANRW-2020" target="https://qlog.edm.uhasselt.be/anrw/">
          <front>
            <title>Debugging QUIC and HTTP/3 with qlog and qvis</title>
            <author initials="R." surname="Marx" fullname="Robin Marx">
              <organization/>
            </author>
            <author initials="M." surname="Piraux" fullname="Maxime Piraux">
              <organization/>
            </author>
            <author initials="P." surname="Quax" fullname="Peter Quax">
              <organization/>
            </author>
            <author initials="W." surname="Lamotte" fullname="Wim Lamotte">
              <organization/>
            </author>
            <date year="2020" month="September"/>
          </front>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC8546">
          <front>
            <title>The Wire Image of a Network Protocol</title>
            <author fullname="B. Trammell" initials="B." surname="Trammell"/>
            <author fullname="M. Kuehlewind" initials="M." surname="Kuehlewind"/>
            <date month="April" year="2019"/>
            <abstract>
              <t>This document defines the wire image, an abstraction of the information available to an on-path non-participant in a networking protocol. This abstraction is intended to shed light on the implications that increased encryption has for network functions that use the wire image.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8546"/>
          <seriesInfo name="DOI" value="10.17487/RFC8546"/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Much of the initial work by Robin Marx was done at the Hasselt and KU Leuven
Universities.</t>
      <t>Thanks to Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen Petrides, Jari
Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind, Jeremy Laine, Kazu
Yamamoto, Christian Huitema, Hugo Landau and Jonathan Lennox for their feedback
and suggestions.</t>
    </section>
    <section numbered="false" removeInRFC="true" anchor="change-log">
      <name>Change Log</name>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-07">
        <name>Since draft-ietf-quic-qlog-main-schema-07:</name>
        <ul spacing="normal">
          <li>Added path and PathID (#336)</li>
          <li>Removed custom definition of uint64 type (#360, #388)</li>
          <li>ProtocolEventBody is now called ProtocolEventData (#352)</li>
          <li>Editorial changes (#364, #289, #353, #361, #362)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-06">
        <name>Since draft-ietf-quic-qlog-main-schema-06:</name>
        <ul spacing="normal">
          <li>Editorial reworking of the document (#331, #332)</li>
          <li>Updated IANA considerations section (#333)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-05">
        <name>Since draft-ietf-quic-qlog-main-schema-05:</name>
        <ul spacing="normal">
          <li>Updated qlog_version to 0.4 (due to breaking changes) (#314)</li>
          <li>Renamed 'transport' category to 'quic' (#302)</li>
          <li>Added 'system_info' field (#305)</li>
          <li>Removed 'summary' and 'configuration' fields (#308)</li>
          <li>Editorial and formatting changes (#298, #303, #304, #316, #320, #321, #322, #326, #328)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-04">
        <name>Since draft-ietf-quic-qlog-main-schema-04:</name>
        <ul spacing="normal">
          <li>Updated RawInfo definition and guidance (#243)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-03">
        <name>Since draft-ietf-quic-qlog-main-schema-03:</name>
        <ul spacing="normal">
          <li>Added security and privacy considerations discussion (#252)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-02">
        <name>Since draft-ietf-quic-qlog-main-schema-02:</name>
        <ul spacing="normal">
          <li>No changes - new draft to prevent expiration</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-01">
        <name>Since draft-ietf-quic-qlog-main-schema-01:</name>
        <ul spacing="normal">
          <li>Change the data definition language from TypeScript to CDDL (#143)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-quic-qlog-main-schema-00">
        <name>Since draft-ietf-quic-qlog-main-schema-00:</name>
        <ul spacing="normal">
          <li>Changed the streaming serialization format from NDJSON to JSON Text Sequences
(#172)</li>
          <li>Added Media Type definitions for various qlog formats (#158)</li>
          <li>Changed to semantic versioning</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-marx-qlog-main-schema-draft-02">
        <name>Since draft-marx-qlog-main-schema-draft-02:</name>
        <ul spacing="normal">
          <li>These changes were done in preparation of the adoption of the drafts by the QUIC
working group (#137)</li>
          <li>Moved RawInfo, Importance, Generic events and Simulation events to this document.</li>
          <li>Added basic event definition guidelines</li>
          <li>Made protocol_type an array instead of a string (#146)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-marx-qlog-main-schema-01">
        <name>Since draft-marx-qlog-main-schema-01:</name>
        <ul spacing="normal">
          <li>
            <t>Decoupled qlog from the JSON format and described a mapping instead (#89)
            </t>
            <ul spacing="normal">
              <li>Data types are now specified in this document and proper definitions for
fields were added in this format</li>
              <li>64-bit numbers can now be either strings or numbers, with a preference for
numbers (#10)</li>
              <li>binary blobs are now logged as lowercase hex strings (#39, #36)</li>
              <li>added guidance to add length-specifiers for binary blobs (#102)</li>
            </ul>
          </li>
          <li>Removed "time_units" from Configuration. All times are now in ms instead (#95)</li>
          <li>Removed the "event_fields" setup for a more straightforward JSON format
(#101,#89)</li>
          <li>Added a streaming option using the NDJSON format (#109,#2,#106)</li>
          <li>Described optional optimization options for implementers (#30)</li>
          <li>Added QLOGDIR and QLOGFILE environment variables, clarified the .well-known URL
usage (#26,#33,#51)</li>
          <li>Overall tightened up the text and added more examples</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-marx-qlog-main-schema-00">
        <name>Since draft-marx-qlog-main-schema-00:</name>
        <ul spacing="normal">
          <li>All field names are now lowercase (e.g., category instead of CATEGORY)</li>
          <li>Triggers are now properties on the "data" field value, instead of separate field
types (#23)</li>
          <li>group_ids in common_fields is now just also group_id</li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+2963Yb17Um+n89RTWUM0Q6AERSF0twnGxZkh0mukWS485x
PMQCUCQrAlBwVUEUtqI8S//td+hfp1/szG9e1qVQpCQnu/ucPTpjb4sAqtZl
rrnm/TIajVxbtotikg1+XlRnk+xlW29m7aYu5tnj6uysXJ1lp1WdPS3ai6p+
kz2vq7aaVYtm4PLptC7eTjK85+bVbJUvaZh5nZ+2o7JoT0c/b8rZCL+Olnm5
GjWz82KZjw7uuVneFmdVvZ1kTTt3rlzXk4ymbdqjg4N7B0cur4t8kr2q81Wz
rurWYeazutqsJ9mfvj9+4N4UW/pqPsmOV21Rr4p29BCzOte0+Wr+Ol9UK1rJ
tmjcupxkP9KChxktsFzNi1U7zBoasy5OG/pru9Q/2rqc0U+zarnO9Y8lPUw/
latFuSp+ci7ftOdVPXFZNqL/z+iHZpK9GGdP8vodfyEAeFFNy1X4sqoJqPff
5AQC/kwgKBeTrF7SA/+W8/djmox/qyscRDEv26pOp3k8zp6WM4J7uSqjuR5v
ZnnnB57vSdHm8WyLlT3zb0v66RMmfDLOXhb09moVTUebaotV8oNOsORfGvnh
387w5aWT+B09z+v5puhsp4m/5s08WFSb+emCkCLZEp79N/7vml/on8+tKgJ1
W74tJoRoq9PwKcv+9PjZdyMg1ITfOx49HHfwlv8q3gIRnL3w+5uXPn5+M3r4
/tMXP4yODo4O5PE2r8+KdpKdt+26mdy4gRfGxXw53pznTVMs2vG0uJGv6osb
8rheyofFdCO3EAvNCL2z37969fzGzeyibM/57vGXP78t6UrizTldrkmGiXHV
8E1AXDviS3A1/fFJ/q5cFtnzss43fb8/L+jyZX/a5H0//lAus8f5smrbwjk3
Go2yfEqXjO6Wc7zodV29LedFkxXvgDnldFHgFhrtWUS0Z6W0Z220Z5jli0V1
ob+7Im+2WXOe1/iiOgUE8qw9z9tsWqyK07Jt+DpXq2wOaDK88lW+2DZlk9F9
OK/mDb50bYU7cjbOXp3TL0QxNqAB9FYzq8sprZUIDw21mhVrGpNmEpIpSEWr
Oi0XBf2DbdK/TnBhyPPpLmkN66qkb20OWt6qbPF9uZotNgBIe15k5+XZ+WhB
AywACR7YCf3U8c5oZ0SyMp4j05/G2YuCsLEumHTJcxsCMghYw6CcEWVtaYvO
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
QHPaJrPFah/0YJnmQK8V9/08zwmNYLux1lhx8f64QKuglQoXdEdpC/xeIlWE
MoFadlRr7sy8TTguqcQVqrx9MFHfTN33FVfZbdeo/VpuuRyuFTnnZgMWmKu8
m6RUQVbsazWrt2tAWSve7nOTmOPndietkYJ1ogo4z580rmeMl17KSoaReYNd
Cd9ziKGvM6QJJUKUE0tIE5KoXJbdC13khWjvyyzbpi2WWvckBrOM+uD590Pz
FWgdLaS6xvPLMGxjpX9YEAoLMlIUNezC/hGpgcv2psA5gMko3GmhRCYAuaFv
qk2HVr0pC5kIz6JTz1a6or8pts2QO5JcSL6EvaQ7uv/82BvFa+XA3vnC0/Oo
v4cUTQutFhvZvNR8QkmeljC1kSrHrY/nhgtndeZr8XNGZWP1OWgP7NAcRlVo
xMOJqb7lePw6004IHEnR04hHq4r4ssUes/6ZQUK+shwRQ5e7udOaRRTWL31U
k1AfmgqAf/n0WIVoH1PHLmylMvlCG+FYIAeftNrxrHFC/HSHRqmoelrNNiL7
6nFpRod4xYKXQ6LBmiBE0FW3YNPE2OhJqfLybqPkIiL/GvTF1J/w3EMMiu1y
s7K9EQvTqE/Jvg6s3RKeJchKhRhP8Ts7hvzoz8RcUfDySW+Erh3UB0gaNLjQ
l+d2OoD5ZxhUmznH2Vk7KP3Nw9o05zMiSJyaZWWjTxNiYPNZ8x1HY6gfEYxU
SWZKEDP1sY8CGWdyr/JIwwWXCpTBI+K8KLgo+qW7Dkcu3pxMTEgf278L+3eP
xMSfNJVhQYDDe73B3GOvNZDgZAE9vlDQZej0pbKTziaDS5RsZ0HBRXxZtQbH
mgA3Qg1ISz+vy9mm2ngICwglDw9qsqaNSy2WfGaJCY4z16F5yYns641EkX6r
kllxqkKxogtUcB790JouGr+ZIyJsNN26vG3FpZpUlCuJaHrG29AE0+qdir6G
CBw1JgxUndpEzZ0aaLg9pHmjpRK9xN1fjgyKRqqUEefExlNfovdiqJAE2hB5
s66+XcGBGfi5FOsAIsu9kgoLkTgIcTIEQeBMqtXWvnDuPm615Zte/XAcSmA1
VgSr4NN3xlJZUb1clIz8zST8k94oJcNsJluKs+h1zumRug0zbD1ckmJ1zrE1
faWMcMdEaJuDJZaN2EC5dL10OPIyLLJYnl0uJZudIl/wZCG4i8ZQ1YZBZ3bW
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

-->

</rfc>
