Skip to content

Library-logger-to-logger

Recover Logger[S] from LibraryLogger[S]. This unwraps the library-facing sync facade when code needs methods that are only available on the full logger type.

Interface

moonbit
pub fn[S] LibraryLogger::to_logger(self : LibraryLogger[S]) -> Logger[S] {}

input

  • self : LibraryLogger[S] - Library-facing sync logger facade.

output

  • Logger[S] - The underlying full sync logger.

Explanation

Detailed rules explaining key parameters and behaviors

  • This conversion unwraps the existing logger instead of rebuilding it.
  • Sink wiring, target, min level, timestamp behavior, and attached wrappers remain the same.
  • The returned Logger[S] is still that same live wrapped value, so later facade writes or later unwraps continue observing and mutating the same logger instance.
  • Use this when code needs full-surface APIs such as with_timestamp(...), with_filter(...), or with_patch(...).
  • When the wrapped sink is RuntimeSink, unwrapping preserves that runtime sink value, but the result type is still Logger[RuntimeSink] rather than the ConfiguredLogger alias. Runtime-specific operations remain available through full.sink or by keeping a ConfiguredLogger value directly.
  • That same unwrap also preserves queued runtime state and file-backed helper behavior exactly as they existed behind the facade, including drain or flush results, file state snapshots, and file control methods.
  • Runtime and file helper mutations are still live too. Draining queued records, flushing, or changing file helper state through the unwrapped logger changes the same runtime-backed logger that the facade already wrapped.

How to Use

Here are some specific examples provided.

When Need Full Logger-only Composition APIs

When a library-facing logger must be widened temporarily for additional composition:

moonbit
let library_logger = LibraryLogger::new(console_sink(), target="lib")
let full_logger = library_logger.to_logger().with_timestamp()

In this example, the facade is unwrapped so the caller can access full logger composition APIs again.

When Need Runtime Helpers After Library-oriented Config Build

When a library-facing runtime logger should later expose configured runtime controls internally:

moonbit
let full = logger.to_logger()
ignore(full.sink.pending_count())

In this example, unwrapping preserves the same RuntimeSink pipeline, and callers reach runtime-specific helpers through that preserved sink value.

The same handle keeps reflecting later facade writes instead of becoming a detached snapshot.

Error Case

e.g.:

  • If callers only need library-oriented write APIs, unwrapping is unnecessary.

  • Unwrapping does not change the current target or sink behavior by itself.

  • Recovering the full logger does not rebuild or reset the existing sink wrappers.

  • Recovering the full logger does not translate configured runtime state into a simpler snapshot; queued counts, file availability, file failure counters, and runtime file controls stay exactly as they were on the wrapped logger.

  • Recovering the full logger also does not isolate later runtime-helper mutations. If unwrapped code drains queued records or changes file helper state, later facade writes still run against that same updated wrapped logger.

Notes

  1. Use this only when the narrower facade is no longer sufficient.

  2. This is the inverse projection of Logger::to_library_logger().

  3. Use LibraryLogger[S] directly when the narrower package-facing surface is still sufficient.

Published from the repository docs folder with VitePress.