README

#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