#OpenTelemetry Logs API

    This package is the public logs bridge API. It represents log events in the OpenTelemetry log data model and forwards them to an SDK logger when one is installed.

    You can use it directly, but its main role is to let logging libraries or application logging adapters translate existing log events into OpenTelemetry records. Traces, metrics, and logs can then share resource attributes, instrumentation scope, and trace correlation fields.

    #Main Types

    • AnyValue: structured log body and attribute value
    • Severity: OpenTelemetry severity ladder
    • LogRecord: mutable builder for one log event
    • LoggerProvider: entry point that creates loggers
    • Logger: emits records for one instrumentation scope

    #Creating A Record

    ///|
    async fn _logs_readme_emit() -> Unit {
    let logger = LoggerProvider::noop().logger("example")
    if logger.event_enabled(Info, "example") {
    let record = logger.create_log_record()
    record.set_event_name("user.created")
    record.set_target("example")
    record.set_severity_number(Info)
    record.set_body(String("created user"))
    record.add_attribute("user.plan", String("free"))
    logger.emit(record)
    }
    }

    Use event_enabled() as a guard before building expensive records. The current implementation only checks whether the logger has a real SDK backend; it does not yet apply severity, target, or event-name filtering.

    #Value Mapping

    AnyValue supports scalar and structured values:

    • Int, Double, String, Boolean, and Bytes
    • ListAny for arrays
    • Map for structured objects

    Structured values remain structured when converted into the SDK and OTLP data model. Use simple scalar attributes for common search fields and structured bodies for payloads that should remain grouped.

    #Severity

    Severity follows the OpenTelemetry 24-slot severity ladder:

    • Trace through Trace4
    • Debug through Debug4
    • Info through Info4
    • Warn through Warn4
    • Error through Error4
    • Fatal through Fatal4

    Severity::name() returns the canonical uppercase text, such as INFO, WARN3, or ERROR.

    #Trace Correlation

    Logs can be correlated with traces by adding trace context to the record:

    ///|
    fn _logs_readme_trace_context(
    record : LogRecord,
    trace_id : @common.TraceId,
    span_id : @common.SpanId,
    ) -> Unit {
    record.set_trace_context(trace_id, span_id)
    }

    When using trace APIs directly, prefer passing the current span context from the active Context or Span so logs and spans share the same trace identifiers.

    #Record Reference

    • LogRecord::new() creates an empty mutable record.
    • set_event_name(name) stores the OTLP event_name field.
    • set_target(target) stores the target used for export-time scope grouping.
    • set_timestamp(ts) sets event time in Unix nanoseconds.
    • set_observed_timestamp(ts) sets observed time in Unix nanoseconds.
    • set_severity_text(text) sets exact exported severity text.
    • set_severity_number(severity) sets structured severity.
    • set_body(body) sets the log body.
    • add_attribute(key, value) appends one ad-hoc structured attribute.
    • add_attributes(attributes) appends shared KeyValue attributes.
    • set_trace_context(trace_id, span_id, trace_flags?) attaches explicit trace correlation fields; omitted flags default to zero.

    When a field is omitted, emit() fills defaults:

    • body becomes an empty string
    • event timestamp becomes current time
    • observed timestamp becomes current time
    • severity text is derived from severity number when possible

    #Provider And Logger Reference

    • LoggerProvider::noop() drops all emitted records.
    • logger(name) creates a logger for one instrumentation name.
    • logger_with_scope(scope) creates a logger from a full instrumentation scope.
    • Logger::create_log_record() creates a fresh mutable record.
    • Logger::emit(record) forwards the record to the installed logger.
    • Logger::event_enabled(severity, target, name?) is the pre-construction guard for potentially expensive log records.

    Applications register SDK providers through sdk.set_logger_provider(provider); the SDK facade updates interface/global for API callers.

    #No-Op Behavior

    No-op loggers silently drop emitted records. Creating and populating a LogRecord still has normal application cost, so use event_enabled() around expensive message formatting or payload construction.

    AnyValue

    pub(all) enum AnyValue {
    Int(Int64)
    Double(Double)
    String(String)
    Boolean(Bool)
    Bytes(Bytes)
    ListAny(Array[AnyValue])
    Map(Map[String, AnyValue])
    } derive(Eq, ToJson,
    Debug
    )

    Log body or attribute value accepted by the public logging API.

    Values remain structured when bridged into the SDK and OTLP exporters. Use scalar attributes for common query dimensions and structured bodies for payloads that should stay grouped. Spec: https://opentelemetry.io/docs/specs/otel/common/#anyvalue

    AnyValue::from_common

    Converts a shared attribute value into a public log value. Spec: https://opentelemetry.io/docs/specs/otel/common/#anyvalue

    AnyValue::map

    fn AnyValue::map(values : Map[String, AnyValue]) -> AnyValue

    Returns a map value with deterministic key insertion order. Spec: https://opentelemetry.io/docs/specs/otel/common/#anyvalue

    KeyValue

    Structured log attribute key/value pair used by the public logging API. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-attributes

    KeyValue::from_common

    Converts a shared attribute into a public log attribute. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-attributes

    KeyValue::new

    fn KeyValue::new(key : StringView, value : AnyValue) -> KeyValue

    Creates a structured log attribute. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-attributes

    LogRecord

    pub struct LogRecord {
    event_name : String?
    target : String?
    timestamp_unix_nano : Int64?
    observed_timestamp_unix_nano : Int64?
    severity_text : String?
    severity_number : Severity?
    body : AnyValue?
    attributes : Array[KeyValue]
    trace_context :
    SpanContext
    ?
    } derive(Eq, ToJson,
    Debug
    )

    Mutable log record builder used by Logger::emit().

    Construct records only after checking Logger::event_enabled() when formatting or attribute construction is expensive. emit() fills missing timestamps and default body values when an SDK logger is installed. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#log-and-event-record-definition

    LogRecord::add_attribute

    fn LogRecord::add_attribute(self : LogRecord, key : StringView, value : AnyValue) -> Unit

    Adds one attribute to the log record.

    Attribute keys should be stable names. Prefer scalar values for fields that users will search or group by. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-attributes

    LogRecord::add_attributes

    Appends multiple pre-built attributes to the log record. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-attributes

    LogRecord::new

    fn LogRecord::new() -> LogRecord

    Creates an empty mutable log record.

    The record is not tied to a logger until passed to Logger::emit(). Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#log-and-event-record-definition

    LogRecord::set_body

    fn LogRecord::set_body(self : LogRecord, body : AnyValue) -> Unit

    Sets the log body.

    If no body is set, SDK-backed loggers export an empty string body. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-body

    LogRecord::set_event_name

    fn LogRecord::set_event_name(self : LogRecord, name : StringView) -> Unit

    Sets the event name that will later be exported through the OTLP event_name field. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-eventname

    LogRecord::set_observed_timestamp

    fn LogRecord::set_observed_timestamp(self : LogRecord, observed_timestamp_unix_nano : Int64) -> Unit

    Sets the observed timestamp in Unix nanoseconds.

    When omitted, SDK-backed loggers use the current time. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-observedtimestamp

    LogRecord::set_severity_number

    fn LogRecord::set_severity_number(self : LogRecord, severity_number : Severity) -> Unit

    Sets the structured severity number to export. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-severitynumber

    LogRecord::set_severity_text

    fn LogRecord::set_severity_text(self : LogRecord, severity_text : StringView) -> Unit

    Sets the exact severity text to export.

    If this is not set but a severity number is present, SDK-backed loggers derive the text from Severity::name(). Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-severitytext

    LogRecord::set_target

    fn LogRecord::set_target(self : LogRecord, target : StringView) -> Unit

    Sets the log target used for export-time scope grouping. Related spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-instrumentationscope

    LogRecord::set_timestamp

    fn LogRecord::set_timestamp(self : LogRecord, timestamp_unix_nano : Int64) -> Unit

    Sets the event timestamp in Unix nanoseconds.

    When omitted, SDK-backed loggers use the current time. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-timestamp

    LogRecord::set_trace_context

    Stores explicit trace correlation fields on the record.

    Use this when bridging logs from code that already knows the trace and span identifiers. When trace_flags is omitted, the trace flags default to zero. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#trace-context-fields

    Logger

    pub struct Logger {
    emit_fn : async (LogRecord) -> Unit
    event_enabled_fn : (Severity, StringView, String?) -> Bool
    }

    Public logger handle.

    A logger emits records for one instrumentation scope. When backed by a no-op provider, all emissions are silently dropped. Spec: https://opentelemetry.io/docs/specs/otel/logs/api/#logger

    Logger::create_log_record

    fn Logger::create_log_record(self : Logger) -> LogRecord

    Creates a fresh mutable LogRecord.

    The returned record is not pre-populated with scope or provider data. Spec: https://opentelemetry.io/docs/specs/otel/logs/api/#emit-a-logrecord

    Logger::emit

    async fn Logger::emit(self : Logger, record : LogRecord) -> Unit

    Emits one log record through the underlying logger.

    Missing timestamps, severity text, and body defaults are supplied by SDK adapters. No-op loggers drop the record silently. Spec: https://opentelemetry.io/docs/specs/otel/logs/api/#emit-a-logrecord

    Logger::event_enabled

    fn Logger::event_enabled(self : Logger, severity : Severity, target : StringView, name? : String?) -> Bool

    Returns whether log emission is currently enabled for this logger.

    Use this as a guard before expensive message formatting or structured body construction.

    OTel specifies the enabled guard over context, severity, and event name; target is this API's local filtering dimension. Spec: https://opentelemetry.io/docs/specs/otel/logs/api/#enabled

    Logger::from_functions

    fn Logger::from_functions(emit_fn : async (LogRecord) -> Unit, event_enabled_fn? : (Severity, StringView, String?) -> Bool) -> Logger

    Builds a logger from emission and filtering callbacks. Spec: https://opentelemetry.io/docs/specs/otel/logs/api/#logger

    LoggerProvider

    Public logger provider.

    Applications install SDK-backed providers through the SDK facade while library code depends only on this API type. Spec: https://opentelemetry.io/docs/specs/otel/logs/api/#loggerprovider

    LoggerProvider::from_functions

    Builds a logger provider from a scope-to-logger callback. Spec: https://opentelemetry.io/docs/specs/otel/logs/api/#loggerprovider

    LoggerProvider::logger

    fn LoggerProvider::logger(self : LoggerProvider, name : StringView) -> Logger

    Returns a logger for one instrumentation name.

    If the provider is no-op, the returned logger is also no-op. Spec: https://opentelemetry.io/docs/specs/otel/logs/api/#get-a-logger

    LoggerProvider::logger_with_scope

    Returns a logger for a fully constructed instrumentation scope.

    The scope name, version, schema URL, and attributes are forwarded to the SDK provider by SDK adapters. Spec: https://opentelemetry.io/docs/specs/otel/logs/api/#get-a-logger

    LoggerProvider::noop

    Returns a no-op logger provider.

    Loggers from this provider report event_enabled() == false and drop emitted records. Spec: https://opentelemetry.io/docs/specs/otel/logs/api/#loggerprovider

    Severity

    pub(all) enum Severity {
    Trace
    Trace2
    Trace3
    Trace4
    Debug
    Debug2
    Debug3
    Debug4
    Info
    Info2
    Info3
    Info4
    Warn
    Warn2
    Warn3
    Warn4
    Error
    Error2
    Error3
    Error4
    Fatal
    Fatal2
    Fatal3
    Fatal4
    } derive(Compare, Eq, Hash, ToJson,
    Debug
    )

    Public severity ladder matching the OpenTelemetry log data model.

    The variants map to OpenTelemetry's 24 severity slots. Severity::name() returns the canonical uppercase text such as INFO, WARN3, or ERROR. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#severity-fields

    Severity::name

    fn Severity::name(self : Severity) -> String

    Returns the canonical uppercase text form for one severity variant.

    If LogRecord::severity_text is not set, SDK adapters derive it from this method when a severity number exists. Spec: https://opentelemetry.io/docs/specs/otel/logs/data-model/#mapping-of-severitynumber

    Source Files