Skip to content

Async-logger-with-timestamp

Enable or disable automatic timestamp capture on async log emission. This API controls whether AsyncLogger::log(...) records the current time before enqueue or leaves the timestamp at 0UL.

Interface

moonbit
pub fn[S] AsyncLogger::with_timestamp(self : AsyncLogger[S], enabled~ : Bool = true) -> AsyncLogger[S] {}

input

  • self : AsyncLogger[S] - Base async logger whose timestamp behavior should change.
  • enabled : Bool - Whether emitted records should capture current time automatically.

output

  • AsyncLogger[S] - A new async logger value with updated timestamp behavior.

Explanation

Detailed rules explaining key parameters and behaviors

  • When enabled, log(...) captures @env.now() before placing the record into the queue.
  • When disabled, emitted records use 0UL as the timestamp value.
  • This setting affects later emitted records only.
  • The returned logger is derived from self; the original async logger value is not mutated.
  • Only the stored timestamp flag changes. Target, minimum level, queue configuration, and lifecycle/failure state stay on the same AsyncLogger[S] surface.
  • In the current direct async coverage, a derived timestamp-enabled logger records non-zero timestamps while the original logger continues emitting 0UL timestamps when it was left disabled.

How to Use

Here are some specific examples provided.

When Need Real Event Time Before Queueing

When downstream formatting or JSON output should include event time:

moonbit
let logger = async_logger(console_sink())
  .with_timestamp()

In this example, each record captures its timestamp before entering the async queue.

And the returned async logger still keeps the same queue-facing API surface as the source logger.

When Need Deterministic Async Records

When timestamps should be disabled for tests or reduced output:

moonbit
let logger = async_logger(console_sink())
  .with_timestamp(enabled=false)

In this example, queued records are emitted without runtime time capture.

Error Case

e.g.:

  • If timestamps are disabled, formatters that expect meaningful time values may show empty or zero-like timestamp output.

  • If callers need timestamps only for one record, a separate logger value is usually clearer than toggling behavior repeatedly.

Notes

  1. This API controls record creation before enqueue, not formatter display policy.

  2. It is useful for tests, deterministic snapshots, and production timing.

  3. State helpers such as pending_count(), dropped_count(), is_closed(), and has_failed() remain available on the returned logger because the visible async logger surface is preserved.

  4. Use a derived logger value when only one branch should capture timestamps and the base logger should remain deterministic.

Published from the repository docs folder with VitePress.