Skip to content

Async-logger-build-config-type

AsyncLoggerBuildConfig is the public config object that combines the base synchronous LoggerConfig with the async runtime AsyncLoggerConfig. It is a direct alias to the build-config model used by async builder APIs, parsers, and serializers, even though the available builders consume different parts of the embedded sync config.

Interface

moonbit
pub type AsyncLoggerBuildConfig = @utils.AsyncLoggerBuildConfig

output

  • AsyncLoggerBuildConfig - Public async build config object containing logger and async_config.

Explanation

Detailed rules explaining key parameters and behaviors

  • This is a type alias, not a built logger instance.
  • The current fields are logger : LoggerConfig and async_config : AsyncLoggerConfig.
  • The public src-async surface forwards this alias directly from @utils.AsyncLoggerBuildConfig, so constructor, parser, export, and stringify helpers all operate on one shared underlying build-config model.
  • AsyncLoggerBuildConfig::new(...) constructs this type as the main handoff object for async build flows.
  • build_async_logger(...), build_async_text_logger(...), parse_async_logger_build_config_text(...), async_logger_build_config_to_json(...), and stringify_async_logger_build_config(...) all consume or produce this same public shape.
  • The same typed object also feeds the application and library facade builders. build_application_async_logger(...), build_application_text_async_logger(...), build_library_async_logger(...), and build_library_async_text_logger(...) all accept this exact config type and then delegate to one of the two direct builder lines.
  • The parse-and-build facade helpers use the same model as well. parse_and_build_application_async_logger(...) and parse_and_build_library_async_logger(...) first parse JSON into this build-config shape and then forward into their respective facade builders.
  • build_async_logger(...) consumes the full sync build path by calling build_logger(config.logger) first, so LoggerConfig.sink, LoggerConfig.queue, and the resulting runtime sink behavior all participate before the async layer is added.
  • build_async_text_logger(...) is narrower: it builds a text console sink directly from config.logger.sink.text_formatter and the top-level min_level, target, and timestamp fields, without applying LoggerConfig.queue.
  • On that text-specific path, config.logger.sink.kind also does not decide the runtime sink shape. build_async_text_logger(...) still constructs FormattedConsoleSink from config.logger.sink.text_formatter even if the config says Console, JsonConsole, or File.
  • In practice, the builder function you choose is what decides how the embedded LoggerConfig is interpreted. The runtime-sink line (build_async_logger(...) and the application/library facades layered on it) preserves the full sync build path, while the text-console line (build_async_text_logger(...) and the facades layered on it) ignores the optional sync queue and does not branch on logger.sink.kind.

How to Use

Here are some specific examples provided.

When Need One Typed Object For Full Async Logger Setup

When sync sink setup and async runtime policy should move together through application boot code:

moonbit
let config : AsyncLoggerBuildConfig = AsyncLoggerBuildConfig::new(
  logger=@bitlogger.LoggerConfig::new(target="svc"),
  async_config=AsyncLoggerConfig::new(max_pending=64),
)

In this example, both layers of logger setup are kept in one typed value.

And downstream code can still choose between the full sync-first builder path and the narrower text-console builder path.

And if downstream code chooses build_async_text_logger(...), that builder choice still matters more than logger.sink.kind because only the formatter-backed text path is consumed there.

And the same typed object can be handed unchanged to build_application_async_logger(...), build_application_text_async_logger(...), build_library_async_logger(...), or build_library_async_text_logger(...) when the caller wants a different public facade over the same underlying build decision.

When Need To Export Or Inspect The Full Build Shape

When application code should inspect the combined async build configuration before constructing the logger:

moonbit
let config = AsyncLoggerBuildConfig::new(async_config=AsyncLoggerConfig::new(max_batch=4))
println(stringify_async_logger_build_config(config, pretty=true))

In this example, the same public config object supports both review and later build steps.

Error Case

e.g.:

  • AsyncLoggerBuildConfig itself does not have a runtime failure mode.

  • If only async runtime policy is needed and the base sync logger config is irrelevant, this type may be broader than necessary and AsyncLoggerConfig is the smaller fit.

  • If callers expect every LoggerConfig field to affect every async builder in the same way, that assumption is too broad: the text-specific builder intentionally ignores the optional sync queue layer.

  • In particular, carrying logger.sink.kind=File inside this config type does not force the later text-specific builder path to create a file-backed async logger; only build_async_logger(...) branches on sink kind.

  • Likewise, choosing an application or library facade builder does not change these config semantics by itself. Those facade APIs inherit the same runtime-sink-versus-text-console split from the direct builder they delegate to.

Notes

  1. Use AsyncLoggerBuildConfig::new(...) when one object should carry both sync and async logger setup.

  2. Use parse_async_logger_build_config_text(...) when the same shape should come from JSON text instead of handwritten code.

  3. Pick build_async_logger(...) when the full synchronous config path, including LoggerConfig.queue, should be preserved before async wrapping.

  4. Pick build_async_text_logger(...) when the goal is specifically a concrete text console sink and only the selected text-oriented LoggerConfig fields should apply.

  5. Pick the application or library facade builders when the same config should drive one of those narrower public surfaces; the chosen facade changes the exposed type, but the direct builder line underneath still determines whether queue and sink-kind settings are preserved or ignored.

Published from the repository docs folder with VitePress.