birch/erlang_logger

Erlang :logger integration for birch.

This module provides optional integration with Erlang’s built-in :logger system, allowing birch to:

  1. Forward to :logger: Create a handler that sends birch records to Erlang’s :logger system (useful for integrating with OTP applications)

  2. Receive from :logger: Install birch as an Erlang :logger handler to receive logs from OTP applications and process them with birch handlers

Note: These features are only available on the Erlang target. On JavaScript, the functions will return errors indicating the feature is unavailable.

Example: Forward logs to Erlang :logger

import birch as log
import birch/erlang_logger

pub fn main() {
  // Configure birch to forward to Erlang's :logger
  log.configure([
    log.config_handlers([erlang_logger.forward_to_logger()]),
  ])

  // Logs will now go to Erlang's :logger system
  log.info("Hello from Gleam!")
}

Example: Receive logs from OTP applications

import birch/erlang_logger

pub fn main() {
  // Install birch as an Erlang :logger handler
  case erlang_logger.install_logger_handler() {
    Ok(Nil) -> {
      // Logs from OTP applications will now be processed by birch
    }
    Error(reason) -> {
      // Handle error (e.g., on JavaScript target)
    }
  }
}

Types

Erlang :logger log levels.

Erlang uses syslog-style levels which are more granular than birch levels. These are mapped to/from birch levels as follows:

Erlang LevelGleam Level
emergencyFatal
alertFatal
criticalFatal
errorErr
warningWarn
noticeInfo
infoInfo
debugDebug/Trace
pub type ErlangLevel {
  ErlangEmergency
  ErlangAlert
  ErlangCritical
  ErlangError
  ErlangWarning
  ErlangNotice
  ErlangInfo
  ErlangDebug
}

Constructors

  • ErlangEmergency
  • ErlangAlert
  • ErlangCritical
  • ErlangError
  • ErlangWarning
  • ErlangNotice
  • ErlangInfo
  • ErlangDebug

Values

pub const default_handler_id: String

Default handler ID used when installing birch as a :logger handler.

pub fn erlang_level_to_atom(erlang_level: ErlangLevel) -> String

Convert an Erlang level to its atom representation (for FFI).

pub fn erlang_level_to_gleam(
  erlang_level: ErlangLevel,
) -> level.Level

Convert an Erlang :logger level to a Gleam log level.

pub fn forward_to_logger() -> handler.Handler

Create a handler that forwards birch records to Erlang’s :logger system.

This allows birch to integrate with existing OTP logging infrastructure, including any :logger handlers already configured (default handler, file handlers, etc.).

On JavaScript, this creates a handler that writes to console instead, since :logger is not available.

Example

import birch as log
import birch/erlang_logger
import birch/handler/console

pub fn main() {
  // Use both console and :logger output
  log.configure([
    log.config_handlers([
      console.handler(),
      erlang_logger.forward_to_logger(),
    ]),
  ])
}
pub fn forward_to_logger_raw() -> handler.Handler

Create a handler that forwards birch records to :logger with proper level mapping (not just the formatted message).

This handler passes the full LogRecord to :logger, preserving the log level and metadata. Use this when you want :logger to receive structured log data.

pub fn forward_to_logger_with_formatter(
  format: fn(record.LogRecord) -> String,
) -> handler.Handler

Create a handler that forwards to :logger with a custom formatter.

pub fn gleam_level_to_erlang(
  gleam_level: level.Level,
) -> ErlangLevel

Convert a Gleam log level to an Erlang :logger level.

pub fn install_logger_handler() -> Result(Nil, String)

Install birch as an Erlang :logger handler.

Once installed, logs from OTP applications (and Erlang code using :logger) will be processed by birch’s configured handlers.

Returns Ok(Nil) on success, or Error(reason) if installation fails. On JavaScript, always returns Error("erlang:logger is not available on JavaScript target").

Example

import birch/erlang_logger

pub fn main() {
  case erlang_logger.install_logger_handler() {
    Ok(Nil) -> io.println("Installed birch as :logger handler")
    Error(reason) -> io.println("Failed: " <> reason)
  }
}
pub fn install_logger_handler_with_id(
  handler_id: String,
) -> Result(Nil, String)

Install birch as an Erlang :logger handler with a custom handler ID.

This is useful if you want to install multiple instances or avoid conflicts with other handlers.

pub fn uninstall_logger_handler() -> Result(Nil, String)

Uninstall the birch :logger handler.

Removes the handler installed by install_logger_handler(). Returns Ok(Nil) on success, or Error(reason) if removal fails.

pub fn uninstall_logger_handler_with_id(
  handler_id: String,
) -> Result(Nil, String)

Uninstall a birch :logger handler with a specific ID.

Search Document