class

Logit::Integrations::CrystalLogAdapter

Inherits Log::Backend / Reference / Object

Adapter that captures Crystal Log calls and forwards them to Logit.

This enables unified logging infrastructure where all logs flow through Logit, providing OTLP export, trace context, and wide events.

Installation

require "logit"
require "logit/integrations/crystal_log_adapter"

# Configure Logit first
Logit.configure do |config|
  config.console(Logit::LogLevel::Debug)
  config.otlp("http://localhost:4318/v1/logs")
end

# Install the adapter
Logit::Integrations::CrystalLogAdapter.install

# All Log.info/debug/etc calls now flow through Logit
Log.info { "This is captured by Logit" }

Protection Against Library Interference

Once installed, the adapter monkeypatches Log.setup, Log.setup_from_env, and Log::Builder#bind to automatically reinstall itself after any library attempts to reconfigure Crystal's logging. This ensures that all logs continue to flow through Logit even when third-party libraries call Log.setup_from_env at require time.

Trace Context Integration

When installed, Crystal Log calls automatically inherit trace context from any active Logit span:

@[Logit::Log]
def process_request
  # This Log call inherits the trace context from the span
  Log.info { "Processing request" }

  do_work

  Log.info { "Request complete" }
end

Namespace Mapping

Crystal Log sources are mapped to Logit namespaces, allowing you to control logging per-source:

Logit.configure do |config|
  console = config.console

  # Control Crystal Log sources via namespace bindings
  config.bind "db.*", Logit::LogLevel::Debug, console
  config.bind "http.client", Logit::LogLevel::Warn, console
end

Constructors

new(dispatch_mode : ::Log::DispatchMode = :async)
Source

Class methods

install(dispatch_mode : ::Log::DispatchMode = :sync) : Nil

Install this adapter as Crystal Log backend.

This replaces the default Log backend so all Log calls flow through Logit. You should configure Logit backends BEFORE calling install.

Once installed, the adapter will automatically reinstall itself if any library calls Log.setup, Log.setup_from_env, or modifies the Log builder directly. This protects against third-party libraries that configure logging at require time.

  • dispatch_mode: How to dispatch log entries. Use :sync for synchronous (safer but may block) or :async for asynchronous (better performance). Default is :sync for reliability.
# Configure Logit first
Logit.configure do |config|
  config.console(Logit::LogLevel::Debug)
end

# Then install the adapter
Logit::Integrations::CrystalLogAdapter.install

# Or with async dispatch for better performance
Logit::Integrations::CrystalLogAdapter.install(dispatch_mode: :async)
Source
installed?

Check if the adapter is currently installed.

Source
intercepting?

Check if we're currently in the middle of an intercept operation. Used by the monkeypatched methods to avoid infinite recursion.

Source
reinstall_if_needed

Reinstall the adapter after external code modified Log configuration. This is called by the monkeypatched Log methods.

Source
uninstall

Uninstall the adapter and restore default Log behavior.

This resets Crystal Log to its default configuration (Info to STDOUT) and removes the monkeypatches that protect against library interference.

Source

Instance methods

write(entry : ::Log::Entry) : Nil

Writes the entry to this backend.

Source